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

时间:2013-12-08 03:42:34

标签: python json file-io compression zlib

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

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

decompress error due to a truncated stream

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

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

2 个答案:

答案 0 :(得分:24)

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

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

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

这具有额外的优势,即压缩算法可以在对象中使用重复来获得压缩率。

答案 1 :(得分:0)

您可能想尝试增量json解析器,例如jsaone

也就是说,用你的所有对象创建一个单个 json,然后像

一样解析它
@IBOutlet weak var adBannerView: GADBannerView!
adBannerView.adUnitID = kadmobID
adBannerView.rootViewController = self
adBannerView.load(GADRequest())

这与马丁的答案非常相似,浪费的空间略大,但可能稍微舒服一点。

编辑:哦,顺便说一句,澄清我写jsaone可能是公平的。