example - python plot line



Python Komprimieren einer Serie von JSON-Objekten während serieller Lesevorgänge beibehalten werden? (2)

Ich habe eine Menge JSON-Objekte , die ich komprimieren muss, weil sie zu viel Speicherplatz verbrauchen, ungefähr 20 gigs für ein paar Millionen von ihnen.

Im Idealfall möchte ich jeden einzeln komprimieren und dann, wenn ich sie lesen muss, iterativ jeden einzelnen laden und dekomprimieren. Ich habe versucht, dies zu tun, indem ich eine Textdatei mit jeder Zeile, die ein komprimiertes JSON-Objekt über Zlib ist , erstellt, aber das scheitert mit einem

decompress error due to a truncated stream ,

was meiner Meinung nach auf die komprimierten Strings zurückzuführen ist, die neue Zeilen enthalten.

Wer kennt eine gute Methode dafür?


Answer #1

Verwenden gzip.GzipFile() einfach ein gzip.GzipFile() -Objekt und behandeln Sie es wie eine normale Datei; schreibe JSON-Objekte zeilenweise und lies sie Zeile für Zeile durch.

Das Objekt sorgt für eine transparente Komprimierung und puffert die Lesevorgänge, wobei die Spannfutter nach Bedarf dekomprimiert werden.

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

Dies hat den zusätzlichen Vorteil, dass der Komprimierungsalgorithmus eine Wiederholung über Objekte für Komprimierungsverhältnisse verwenden kann.


Answer #2

Möglicherweise möchten Sie einen inkrementellen JSON-Parser wie jsaone ausprobieren .

Das heißt, erstellen Sie einen einzelnen JSON mit all Ihren Objekten und parsen Sie es wie

with gzip.GzipFile(file_path, 'r') as f_in:
    for key, val in jsaone.load(f_in):
        ...

Das ist Martins Antwort ziemlich ähnlich, da es etwas mehr Platz verschwendet, aber vielleicht etwas komfortabler.

EDIT: Oh, übrigens, es ist wahrscheinlich fair zu klären, dass Jsaone schrieb.





zlib