如何使用rredis从R编写的Redis中实现数据压缩以减少内存使用?

时间:2017-05-12 11:47:20

标签: r redis compression rstudio

我需要压缩存储在Redis中的数据。我将R中的数据(带有包rredis)写入Redis,如下所示:

redisSet("x","{\"email\":\"master@disaster.com\",\"Ranking\":[{\"Number\":37665,\"rank\":1},{\"Number\":41551,\"rank\":2},{\"Number\":21684,\"rank\":3},{\"Number\":35946,\"rank\":4}]}")

在此值的列表中,不是4个元素,而在实际场景中将有4000个,而总共有70000个键。目前,每个密钥大约需要0.15 MB。

我读到可以在Redis中显着压缩这些条目的内存使用量,例如:使用LZO或Snappy等算法。但我无法找到有关具体实施的信息。 一些解决问题的建议?谢谢!

1 个答案:

答案 0 :(得分:0)

谢谢你的提示!我能够实现它,这里有一些细节:

我按照建议在R(基本包)中使用了压缩函数。

memCompress()

我尝试了不同的压缩gzip和bzip2。

memCompress(type="gzip",...)
memCompress(type="bzip2",...)

以下是带有玩具示例的代码:

#In R:
x<-"{\"email\":\"master@disaster.com\",\"Ranking\":[{\"Number\":37665,\"rank\":1},{\"Number\":41551,\"rank\":2},{\"Number\":21684,\"rank\":3},{\"Number\":35946,\"rank\":4}]}"
y<-memCompress(charToRaw(x),type="gzip")
# [1] 78 9c 4d c9 3d 0a 80 20 00 06 d0 bb 7c b3 04 e6 4f e5 d4 09 1a 5a a3 c1 4a 42 ca 02 ad 29 bc 7b 11 48 6d 0f de 05 e3 b4 5d a1 e0 74 38 8c
# [47] af 27 1b 5e 64 e3 ee 40 d0 ea 6d b1 db 0c d5 5d 68 4e 37 18 0f c5 0a 29 05 81 7f 0a 8a 46 f2 0d a7 42 d0 34 f9 7f 72 2a 4b 9e 86 fd 87 89
# [93] 8a cb 34 3c f6 f1 06 b3 67 2d c4
rawToChar(memDecompress(y,type="gzip"))
# [1] "{\"email\":\"master@disaster.com\",\"Ranking\":[{\"Number\":37665,\"rank\":1},{\"Number\":41551,\"rank\":2},{\"Number\":21684,\"rank\":3},{\"Number\":35946,\"rank\":4}]}"  



# R to redis:
redisConnect(host="XXX.XX.XX.XXX", port=XXXX, timeout =10) # Insert your redis information (IP and port)
x<-"{\"email\":\"master@disaster.com\",\"Ranking\":[{\"Number\":37665,\"rank\":1},{\"Number\":41551,\"rank\":2},{\"Number\":21684,\"rank\":3},{\"Number\":35946,\"rank\":4}]}"
redisSet("x",x) #Wrong transfer of character string to redis
# redis-cli # On redis server
# get x # On redis server
# "X\n\x00\x00\x00\x02\x00\x03\x03\x02\x00\x02\x03\x00\x00\x00\x00\x10\x00\x00\x00\x01\x00\x04\x00\t\x00\x00\x00\x93{\"email\":\"master@disaster.com\",\"Ranking\":[{\"Number\":37665,\"rank\":1},{\"Number\":41551,\"rank\":2},{\"Number\":21684,\"rank\":3},{\"Number\":35946,\"rank\":4}]}"
redisSet("x",charToRaw(x)) #Right transfer of character string to redis
# redis-cli # On redis server
# get x # On redis server
# "{\"email\":\"master@disaster.com\",\"Ranking\":[{\"Number\":37665,\"rank\":1},{\"Number\":41551,\"rank\":2},{\"Number\":21684,\"rank\":3},{\"Number\":35946,\"rank\":4}]}"
redisSet("x",memCompress(charToRaw(x),type="gzip")) #Right transfer of compressed string to redis
# redis-cli # On redis server
# get x # On redis server
# "x\x9cM\xc9=\n\x80 \x00\x06\xd0\xbb|\xb3\x04\xe6O\xe5\xd4\t\x1aZ\xa3\xc1JB\xca\x02\xad)\xbc{\x11Hm\x0f\xde\x05\xe3\xb4]\xa1\xe0t8\x8c\xaf'\x1b^d\xe3\xee@\xd0\xeam\xb1\xdb\x0c\xd5]hN7\x18\x0f\xc5\n)\x05\x81\x7f\n\x8aF\xf2\r\xa7B\xd04\xf9\x7fr*K\x9e\x86\xfd\x87\x89\x8a\xcb4<\xf6\xf1\x06\xb3g-\xc4"

# I have not implemented the reimport to R yet. So feel free to add it :)

这个短字符串没有任何改进。但对于长版本(4000而不是json文件中的4个元素),有一个巨大的改进:

在这种情况下,压缩使内存使用和写入时间提高了约85%!

压缩: 是时候编写500个用户,每个用户拥有4.000个元素:12.62秒 内存由500个用户保存,每个redis上有4.000个元素:11.782 MB

未压缩: 是时候写500个用户,每个用户需要4000个元素来重新启动:88.76秒 内存由500个用户保存,每个在redis上为4.000个元素:78.192 MB