在维护串行读取的同时压缩一系列JSON对象?

New*_*wmu 6 python compression file-io json zlib

我有一堆json对象需要压缩,因为它占用了太多的磁盘空间,大约20 gigs价值几百万.

理想情况下,我想要做的是单独压缩每个,然后当我需要读取它们时,只需迭代加载和解压缩每个.我尝试通过创建一个文本文件来做到这一点,每个行都是通过zlib压缩的json对象,但这是失败的

decompress error due to a truncated stream,

我认为这是由于包含新行的压缩字符串.

有人知道这样做的好方法吗?

Mar*_*ers 24

只需使用一个gzip.GzipFile()对象并将其视为常规文件; 逐行编写JSON对象,并逐行读取它们.

该对象透明地处理压缩,并将缓冲读取,根据需要解压缩卡盘.

import gzip
import json

# writing
with gzip.GzipFile(jsonfilename, 'w') as outfile:
    for obj in objects:
        outfile.write(json.dumps(obj) + '\n')

# reading
with gzip.GzipFile(jsonfilename, 'r') as infile:
    for line in infile:
        obj = json.loads(line)
        # process obj
Run Code Online (Sandbox Code Playgroud)

这具有额外的优点,即压缩算法可以利用对象的重复来获得压缩比.

  • 或者从2.3开始的`bz2.BZ2File`,或者从3.3开始的`lzma.LZMAFile`. (2认同)
  • @YiboYang或者只是在``io.TextIOWrapper`实例]中包装`outfile`对象(https://docs.python.org/3/library/io.html#io.TextIOWrapper). (2认同)