我有一堆json对象需要压缩,因为它占用了太多的磁盘空间,大约20 gigs
价值几百万。
理想情况下,我想要做的是单独压缩每个,然后当我需要读取它们时,只需迭代加载和解压缩每个。我尝试通过创建一个文本文件来做到这一点,每个行都是通过zlib压缩的json对象,但这是失败的
decompress error due to a truncated stream
,
我认为这是由于包含新行的压缩字符串。
有人知道这样做的好方法吗?
只需使用gzip.GzipFile()
object并将其视为常规文件;逐行编写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
这具有额外的优点,即压缩算法可以利用跨对象的重复来获得压缩比。
您可能想尝试增量json解析器,例如jsaone。
也就是说,用你的所有对象创建一个json,并解析它
with gzip.GzipFile(file_path, 'r') as f_in:
for key, val in jsaone.load(f_in):
...
这与马丁的答案非常相似,浪费了更多的空间,但可能稍微舒服一些。
编辑:哦,顺便说一句,澄清我写jsaone可能是公平的。