压缩 json 以存储在 redis 或 memcache 等基于内存的存储中的最佳方法是什么?
回答问题 要求:具有 2-3 级嵌套的 Python 对象,包含基本数据类型,如整数、字符串、列表和字典。 (没有日期等),需要在 redis 中针对密钥存储为 json。将 json 压缩为字符串以降低内存占用的最佳方法是什么。目标对象不是很大,平均有 1000 个小元素,转换为 JSON 后大约有 15000 个字符。 例如。 >>> my_dict {'details': {'1': {'a
·
回答问题
要求:具有 2-3 级嵌套的 Python 对象,包含基本数据类型,如整数、字符串、列表和字典。 (没有日期等),需要在 redis 中针对密钥存储为 json。将 json 压缩为字符串以降低内存占用的最佳方法是什么。目标对象不是很大,平均有 1000 个小元素,转换为 JSON 后大约有 15000 个字符。
例如。
>>> my_dict
{'details': {'1': {'age': 13, 'name': 'dhruv'}, '2': {'age': 15, 'name': 'Matt'}}, 'members': ['1', '2']}
>>> json.dumps(my_dict)
'{"details": {"1": {"age": 13, "name": "dhruv"}, "2": {"age": 15, "name": "Matt"}}, "members": ["1", "2"]}'
### SOME BASIC COMPACTION ###
>>> json.dumps(my_dict, separators=(',',':'))
'{"details":{"1":{"age":13,"name":"dhruv"},"2":{"age":15,"name":"Matt"}},"members":["1","2"]}'
1/有没有其他更好的方法来压缩json以节省redis中的内存(也确保之后的轻量级解码)。
2/ msgpack [http://msgpack.org/] 的候选人有多好?
3/ 我也应该考虑泡菜之类的选择吗?
Answers
我们只是使用gzip
作为压缩器。
import gzip
import cStringIO
def decompressStringToFile(value, outputFile):
"""
decompress the given string value (which must be valid compressed gzip
data) and write the result in the given open file.
"""
stream = cStringIO.StringIO(value)
decompressor = gzip.GzipFile(fileobj=stream, mode='r')
while True: # until EOF
chunk = decompressor.read(8192)
if not chunk:
decompressor.close()
outputFile.close()
return
outputFile.write(chunk)
def compressFileToString(inputFile):
"""
read the given open file, compress the data and return it as string.
"""
stream = cStringIO.StringIO()
compressor = gzip.GzipFile(fileobj=stream, mode='w')
while True: # until EOF
chunk = inputFile.read(8192)
if not chunk: # EOF?
compressor.close()
return stream.getvalue()
compressor.write(chunk)
如您所想,在我们的用例中,我们将结果存储为文件。要仅使用内存中的字符串,您也可以使用cStringIO.StringIO()
对象作为文件的替换。
更多推荐
已为社区贡献126483条内容
所有评论(0)