回答问题

要求:具有 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()对象作为文件的替换。

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐