Der schnellste Weg, Millionen kleiner Dateien in einem leistungsstarken Cluster zu komprimieren (dh in einer einzigen Datei zu archivieren), um die Übertragung von Dateien zu beschleunigen

476
vivoru

WICHTIGER HINWEIS: Komprimierung ist NICHT das Ziel. Archivieren / Aufnehmen (Packen aller Dateien in ein einziges Archiv) ist das Ziel.

Ich möchte ein einzelnes Verzeichnis sichern, das hunderte Unterverzeichnisse und Millionen kleiner Dateien (<800 KB) enthält. Beim rsyncKopieren dieser Dateien von einem Computer auf einen anderen Remote-Computer ist mir aufgefallen, dass die Übertragungsgeschwindigkeit mit nur etwa 1 MB / Sek. Schmerzhaft niedrig ist, wohingegen beim Kopieren riesiger Dateien (z. B. 500 GB) die Übertragungsrate in ist Fakt um 120 MB / s. Die Netzwerkverbindung ist also überhaupt nicht das Problem.

In einem solchen Fall hat das Verschieben von nur 200 GB solcher kleinen Dateien etwa 40 Stunden gedauert. Ich denke also daran, das gesamte Verzeichnis, in dem sich diese Dateien befinden, zu komprimieren und das komprimierte Archiv dann auf die Remote-Maschine zu übertragen und anschließend auf der Remote-Maschine zu dekomprimieren. Ich erwarte nicht, dass dieser Ansatz 40 Stunden auf 5 Stunden reduziert, aber ich vermute, dass dies auf jeden Fall weniger als 40 Stunden dauern würde.

Ich habe Zugriff auf ein Cluster mit 14 CPU-Kernen (56 Threads - Intel (R) Xeon (R) Gold 5120 CPU bei 2,20 GHz) und 128 GB RAM. Daher ist die CPU / RAM-Leistung kein Problem.

Aber wie können Sie aus so vielen Dateien ein einziges Archiv am schnellsten und effizientesten erstellen? Ich kenne zurzeit nur diese Ansätze:

Ich weiß jedoch nicht, welche schneller ist und wie die Parameter so eingestellt werden sollten, dass die maximale Geschwindigkeit erreicht wird. (Ist es beispielsweise besser, alle CPU-Kerne mit 7zip oder nur einem zu verwenden?)

Hinweis: Dateigröße und Komprimierungsrate spielen keine Rolle . Ich versuche NICHT, Platz zu sparen. Ich versuche nur, ein einziges Archiv aus so vielen Dateien zu erstellen, dass die Übertragungsrate 120 MB / s anstelle von 1 MB / s beträgt.

VERBINDUNG : 7-Zip schneller machen

2
Der erste mögliche Ansatz, der mir in den Sinn kommt, wäre zuerst 'gzip' und dann 'tar': Durch das getrennte gzippen von Dateien können Sie mehrere Dateien gleichzeitig komprimieren (bis zu 1 pro CPU-Thread). Dies würde die Kompressionszeit in Ihrem Fall durch * bis zu * 56 teilen. Sie können jede andere Komprimierungsmethode als gzip verwenden. Nathan.Eilisha Shiraini vor 5 Jahren 0
Kompression ist wahrscheinlich nicht so wichtig. Da die Dateien klein sind, sind die Gewinne durch das individuelle Komprimieren wahrscheinlich gering. Wenn Sie in umgekehrter Reihenfolge arbeiten, wird wahrscheinlich ein besseres Ergebnis erzielt, wenn die Gesamtgröße der Dateien wichtig ist. Seth vor 5 Jahren 0
Wenn Sie nur möchten, dass die Verbindung vollständig gesättigt ist, spielt die Komprimierung sogar eine Rolle? Würde nicht einfach "Teer" die Arbeit machen? Mokubai vor 5 Jahren 0

1 Antwort auf die Frage

2
davidgo

Verwenden Sie tar, aber verzichten Sie auf den gzipping Teil. Der springende Punkt von TAR ist das Konvertieren von Dateien in einen einzigen Stream (es steht für Bandarchiv). Abhängig von Ihrem Prozess könnten Sie den Stream auf eine Festplatte schreiben und kopieren, aber effizienter können Sie ihn (z. B. über SSH) an den anderen Computer weiterleiten - möglicherweise gleichzeitig entkomprimieren.

Da der Prozess eher IOs als CPU-intensiv ist, hilft das Parellellizing des Prozesses nicht viel, wenn überhaupt. Sie reduzieren die Dateiübertragungsgröße (wenn Dateien nicht genau durch die Blockgröße teilbar sind), und Sie sparen viel, indem Sie nicht für jede Datei das Vor- und Zurückspulen haben.

So erstellen Sie eine unkomprimierte TAR-Datei:

tar -cf file.name /path/to/files 

So streamen Sie über das Netzwerk:

tar -c /path/to/files | ssh user@dest.domain 'cd /dest/dir && tar -x' 

Hinweis: Wenn Sie eine Zwischendatei wie in Beispiel 1 auf eine Festplatte schreiben, kann es bei anständiger Komprimierung tatsächlich schneller sein, die Datei zu komprimieren, da dadurch die Menge an Daten reduziert wird, die auf die Festplatte geschrieben wird der Prozess.

Da fast alle meine Dateien ".bmp" sind, würde die Komprimierung zweifellos die Dateigröße erheblich reduzieren (insbesondere wenn ich etwas wie "7z -mx9" verwende, bin ich sicher, dass das endgültige Archiv eine Komprimierungsrate von mindestens 60% haben wird). Die Kompressionsrate ist mir jedoch völlig egal, vielmehr ist mir die Geschwindigkeit der Übertragung und das schnellstmögliche Abrufen der Dateien auf dem Remote-Rechner von größter Bedeutung. Ist "7zip" (.7z) selbst beim Taping nicht effizienter als "Teer"? vivoru vor 5 Jahren 0
Ich habe das zweite Beispiel viel getestet. Bitte überprüfen Sie, ob das gemeint ist. Kamil Maciorowski vor 5 Jahren 0