Welches Komprimierungsprogramm sollte ich für eine extrem große Nur-Text-Datei verwenden?

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:

  • Ich erwarte, diese Daten einmal zu komprimieren und dann viele Male daraus zu lesen.
  • Ich erwarte nicht, dass sich diese Daten ändern. Ich kann später neue Daten erfassen, aber das ist ein anderes Problem.
  • Alle Lesevorgänge aus dieser Datei erfolgen in sequenzieller Reihenfolge, normalerweise (aber nicht immer) vom Anfang bis zum Ende der Datei.
  • Ich möchte diese Daten irgendwo sichern. Es hat lange gedauert, es zu erwerben, und ich habe nicht vor, es noch einmal zu tun.
  • Ich erwarte nicht, diese Datei vollständig zu dekomprimieren; nur in dem Umfang, der erforderlich ist, um seinen Inhalt an ein anderes Programm weiterzuleiten.
  • Ich interessiere mich nicht für die Beibehaltung von Dateimetadaten.

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.

Antworten (2)

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.

Es sieht so aus, als wäre HDF5 hauptsächlich für numerische Daten gedacht? Meine Daten sind nicht wirklich numerisch, sondern textuell.
@JesseTG: HDF5 kann fast alle Datentypen kombinieren, z. B. hdfgroup.org/portfolio-item/medicine , wo Bilder, Metadaten, Text und Zahlen gespeichert werden.
Und um welches Dienstprogramm handelt es sich genau? Ich finde nur Dokumentation für die C/C++-APIs (die ich im Moment nicht möchte).

Ich habe mich für Zstandard entschieden . Ich habe keine genauen Zahlen zur Hand, aber das passt am besten zu meinen Komprimierungsanforderungen, mit xzeiner 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.

Meine Daten

Etwa 2 TB an zeilengetrennten JSON-Objekten. Also viel, viel Klartext.

Der Befehl

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.)gzbzip2lzma
  • -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.

Der Unterschied

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:

  • Originaldatei : 234.645.370.989 Byte (219 GB)
  • 7zip, komprimiert wie oben : 7.201.531.161 Byte (6,8 GB)
  • zstd : 7.438.787.613 Byte (7 GB)
    • Befehl:zstd -k -T0 -22 --ultra "$INPUT" -o "$INPUT.zst"
  • lrzip : 8.531.295.280 Byte (8 GB)
    • Befehl:lrzip --zpaq --level=9 --maxram=40 --threads=$(nproc) -T -U "$INPUT" -o "$INPUT.lrz"
  • bzip2: 20.016.871.549 Bytes (19 GB)
    • Befehl:bzip2 --best --keep --stdout "$INPUT" > "$INPUT.bz2"
  • gzip : 28.807.716.394 Byte (27 GB)

    • Befehl:gzip --best --stdout "$INPUT" > "$INPUT.gz"
  • lz4 : 32.455.506.529 Byte (31 GB)

    • Befehl:lz4 -9 -BD "$INPUT" "$INPUT.lz4"
  • lzop : 34.197.587.319 Byte (32 GB)
    • Befehl:lzop --best --keep "$INPUT"