在保持串行读取的同时压缩一系列JSON对象?
我有一堆需要压缩的 json对象 ,因为它占用了过多的磁盘空间,大约20 gigs
价值几百万美元。
理想情况下,我想做的是分别压缩每个压缩文件,然后在需要阅读它们时,只需迭代地加载和解压缩每个压缩文件。我尝试通过创建一个文本文件来完成此操作,每行都是通过
zlib 压缩的 json对象 ,但这失败了。 __
decompress error due to a truncated stream
,
我认为这是由于包含新行的压缩字符串所致。
有人知道这样做的好方法吗?
-
只需使用一个
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
这具有额外的优势,即压缩算法可以利用对象 之间 的重复来获得压缩率。