Python сжимает ряд объектов JSON при сохранении последовательного чтения?

у меня есть куча объекты json что мне нужно сжать, поскольку он ест слишком много места на диске, примерно 20 gigs стоимостью за несколько миллионов из них.

В идеале, что я хотел бы сделать, это сжать каждый отдельно, а затем, когда мне нужно их прочитать, просто итеративно загрузить и распаковать каждый. Я попытался сделать это, создав текстовый файл с каждой строкой, являющейся сжатым объект json via zlib, но это не с

decompress error due to a truncated stream,

что, я считаю, связано с сжатыми строками, содержащими новые строки.

кто-нибудь знает хороший способ сделать это?

2 ответов


просто использовать 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 isfile:
    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):
        ...

Это очень похоже на ответ Мартина, тратя немного больше места, но, возможно, немного более комфортно.

EDIT: О, кстати, вероятно, справедливо уточнить, что написал jsaone.