Ich habe viele Daten. Viel . _ Meine Datendatei ist etwas weniger als 2 TB (Terabyte) an zeilengetrennten Nur-Text-Datensätzen, die jeweils etwa 4 oder 5 KB groß sind (insgesamt einige hundert Millionen Datensätze).
Ich priorisiere das Komprimierungsverhältnis, die Stream-Fähigkeit und die Dekomprimierungsgeschwindigkeit. Genauer:
Dies auf einem Linux-HPC-Cluster, also suche ich nach einem Befehlszeilendienstprogramm. Meine Hauptanwärter sind gzip
, bzip2
, und lzma
, aber ich bin offen für andere Optionen. Es ist in Ordnung, wenn ich Software selbst kompilieren muss, solange ich keinen Root-Zugriff benötige.
Ich würde ernsthaft in Betracht ziehen, einen Blick auf das HDF5-Format zu werfen, da es speziell für diese Art von Anwendungsfall entwickelt wurde. Einzelheiten zu den unterstützten Komprimierungsformaten finden Sie hier , beinhalten jedoch vordefinierte ZLIB und SZIP sowie mehrere Optionen von Drittanbietern.
Die Referenzsoftware enthält eine Reihe von Sprachbindungen, und es gibt Bindungen für Python, die über pip verfügbar sind.
Ich habe mich für Zstandard entschieden . Ich habe keine genauen Zahlen zur Hand, aber das passt am besten zu meinen Komprimierungsanforderungen, mit xz
einer knappen Sekunde. Die Komprimierungszeiten sind angemessen, aber ich muss meine Daten nicht schneller dekomprimieren, als ich sie verarbeiten kann.
Ich habe meine Meinung geändert, 7zip ist für meine Bedürfnisse noch besser. Folgendes habe ich getan.
Etwa 2 TB an zeilengetrennten JSON-Objekten. Also viel, viel Klartext.
Dies ist der genaue Befehl, den ich verwende, um meine Daten zu komprimieren, kommentiert:
7z a -t7z -ms=on -myx=9 -mx=9 -mf=off -m0=PPMd:mem2g:o32 "$INPUT.7z" "$INPUT"
Was bedeuten diese nun...
7z
: Das Befehlszeilentool.a
: Fügt eine Datei zu einem Archiv hinzu (oder erstellt, wenn sie noch nicht existiert)-t7z
: Verwenden Sie ein Archiv vom Typ 7z (im Gegensatz zu , , , usw.)gz
bzip2
lzma
-m
: Verwenden Sie diese Methoden zum Komprimieren:
s=on
: Solid -Modus einschalten . Möglicherweise nicht relevant, da ich eine große Datei komprimiere (im Gegensatz zu einer großen Gruppe kleinerer), aber warum nicht?yx=9
: Führen Sie die meisten Dateianalysen durch.x=9
: Verwenden Sie die stärkste verfügbare Komprimierung.f=off
: Kompressionsfilterung ausschalten . _ Dies gilt hauptsächlich für ausführbare Dateien, die ich nicht verarbeite.0=PPMd:mem2g:o32
: Verwenden Sie die folgenden Parameter für die erste (und in meinem Fall einzige) Komprimierungsmethode.
PPMd
: Verwenden Sie den PPMd-Algorithmus, der eine "sehr gute Komprimierungsrate für reine Textdateien" bieten soll.mem2g
: Verwenden Sie 2 GB RAM für Komprimierung und Dekomprimierung.o32
: Verwenden Sie eine Modellordnung von 32. Ich weiß ehrlich gesagt nicht, was das bedeutet, ich habe es einfach auf den höchsten Wert gesetzt, weil es sich gut anfühlte."$INPUT.7z"
: Das Archiv, das ich erstelle."$INPUT"
: Die Datei, die ich im Archiv speichere.Ich habe eine 219 GB große Teilmenge meiner Daten mit mehreren verschiedenen Programmen komprimiert, um zu sehen, welches die besten Ergebnisse erzielt. Ich habe weder Zeit noch Speicher gemessen, sondern nur die Größe. Hier ist, was ich habe:
zstd -k -T0 -22 --ultra "$INPUT" -o "$INPUT.zst"
lrzip --zpaq --level=9 --maxram=40 --threads=$(nproc) -T -U "$INPUT" -o "$INPUT.lrz"
bzip2 --best --keep --stdout "$INPUT" > "$INPUT.bz2"
gzip : 28.807.716.394 Byte (27 GB)
gzip --best --stdout "$INPUT" > "$INPUT.gz"
lz4 : 32.455.506.529 Byte (31 GB)
lz4 -9 -BD "$INPUT" "$INPUT.lz4"
lzop --best --keep "$INPUT"
JesseTG
Steve Barnes
JesseTG