2017-05-12 5 views
0

Redis에 저장된 데이터를 압축해야합니다. 나는이 같은 레디 스에 R에서 (패키지 rredis 포함) 데이터 쓰기 :이 값 목록에메모리 사용을 줄이기 위해 rredis를 사용하여 R에서 작성된 Redis에서 데이터 압축을 구현하는 방법은 무엇입니까?

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

대신 4의 요소를 실제 시나리오와 총 같은 70000 키에 4,000있을 것입니다. 현재이 키들은 ~ 0.15 MB를 사용합니다.

필자는 Redis에서 해당 항목의 메모리 사용을 크게 압축 할 수 있다고 읽었습니다. LZO 또는 Snappy와 같은 알고리즘을 사용합니다. 그러나 구체적인 구현에 대한 정보를 찾을 수 없었습니다. 몇 가지 제안을 통해 문제를 해결할 수 있습니까? 감사!

답변

0

기본 제공 방법이 없습니다.

그러나 Redis는 이진 데이터를 저장할 수 있으므로 원하는 압축 알고리즘으로 데이터를 압축하고 압축 된 이진 데이터를 Redis에 저장할 수 있습니다. 데이터를 읽을 때 이진 데이터를 가져와 동일한 압축 알고리즘으로 압축을 풀어야합니다.

+0

답장을 보내 주셔서 감사합니다! 나는 그렇게 할 수 있었다 :) 나는 완전한 구현 후에 기능과 개선의 수준에 대한 상세한 대답을 게시 할 것이다. – useR

0

힌트를 보내 주셔서 감사합니다! 나는 그것을 구현할 수 있었고 여기에 몇 가지 세부 사항이있다 :

제안 된대로 R (기본 패키지)에 구현 된 압축 기능을 사용했다.

memCompress() 

다른 압축 gzip과 bzip2를 시도했습니다.

#In R: 
x<-"{\"email\":\"[email protected]\",\"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\":\"[email protected]\",\"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\":\"[email protected]\",\"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\":\"[email protected]\",\"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\":\"[email protected]\",\"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\[email protected]\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 :) 

이 짧은 문자열에 대한 개선이 없다 : 여기에

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

장난감 예제와 코드입니다. 하지만 긴 버전 (json 파일의 4 개 요소 대신 4000 개)의 경우 큰 향상이있었습니다.

압축은이 경우 메모리 사용 및 쓰기 시간이 ~ 85 % 향상되었습니다!

압축 : 4.000 요소 각각 500 명의 사용자를 작성하는 시간 레디 스하기 : 12.62 초 레디 스에 4.000 요소 각각 500 사용자들에 의해 유지 메모리 : 11.782 MB

압축 : 시간 4.000와 500 명의 사용자를 작성 88.76 초 500 명의 사용자가 메모리를 유지하면서 각 부분마다 4.000 개의 요소가 있습니다. 78.192MB