Speicherprobleme beim Komprimieren und Übertragen einer großen Anzahl kleiner Dateien (insgesamt 1 TB)

15

Ich habe 5 Millionen Dateien, die ungefähr 1 TB Speicherplatz belegen. Ich muss diese Dateien an Dritte übertragen.

Wie geht das am besten? Ich habe versucht, die Größe mit .tar.gz zu reduzieren, aber obwohl mein Computer über 8 GB RAM verfügt, wird der Fehler "Nicht genügend Systemspeicher" angezeigt.

Ist die beste Lösung, um die Dateien per E-Mail zu versenden?

oshirowanen
quelle
9
Haben Sie Probleme beim ERSTELLEN .tar.gzoder KOPIEREN der resultierenden komprimierten Datei? In jedem Fall ist etwas seltsam, da keine der beiden Operationen mehr Speicher beanspruchen sollte, nur weil die Dateien groß sind. Das heißt, beide Vorgänge sollten gestreamt werden. Bitte geben Sie genau an, welche Befehle fehlschlagen.
Celada,
1
Wie viel Bandbreite haben Sie und der Dritte zur Verfügung? Ein naiver rsync kann Ihnen Porto sparen. Aber ich weiß nicht, wie "fünf Millionen" Dateien für Sie funktionieren werden, da rsync versucht, die Dateiliste im Arbeitsspeicher zu erstellen und wenn Liste (5e6-Dateien)> 8 GB könnte. Und natürlich wird es langsam.
Kalvin Lee
2
@oshirowanen Ich denke nicht, dass es eine Menge Speicherplatz verbrauchen sollte , wenn die Dateiliste berechnet wird, da ich mir ziemlich sicher bin, dass tarDateien nur inkrementell archiviert werden sollten, während sie aufgelistet werden, ohne dass eine Liste im Speicher erstellt wird. Aber auch hier zeigen Sie bitte den genauen Befehl, den Sie verwenden. Befinden sich alle Dateien im selben Verzeichnis oder ist die Verzeichnisstruktur sehr tief?
Celada,
3
Ah ja, GUI-Programme werden häufig ohne große Bedeutung von Zielen wie Skalierbarkeit und Robustheit erstellt. Es würde mich nicht überraschen, wenn es am GUI-Wrapper / Frontend liegt. Erstellen Sie die Datei mit der Befehlszeile und ich denke, Sie werden feststellen, dass es gut funktioniert.
Celada,
3
Die Übertragung von 1 TB Daten über eine 100-Mbit / s-Breitbandverbindung dauert mindestens 22 Stunden. Je nachdem, wie viel Komprimierung Sie erwarten, ist Schneckenpost möglicherweise die schnellste Option.
Dan,

Antworten:

27

Zusätzliche Informationen in den Kommentaren zeigen, dass das OP eine GUI-Methode verwendet, um die .tar.gzDatei zu erstellen .

GUI-Software enthält häufig viel mehr Informationen als die entsprechende Befehlszeilen-Software oder führt zusätzliche unnötige Aufgaben aus, um zusätzliche Funktionen wie eine Fortschrittsanzeige zu erhalten. Es würde mich nicht überraschen, wenn die GUI-Software versucht, eine Liste aller im Speicher befindlichen Dateinamen zu sammeln. Dies ist nicht erforderlich, um ein Archiv zu erstellen. Die dedizierten Tools tarund gzipsind auf die Arbeit mit Streaming-Eingaben und -Ausgaben ausgelegt, was bedeutet, dass sie sich mit Ein- und Ausgaben befassen können, die viel größer sind als der Arbeitsspeicher.

Wenn Sie das GUI-Programm meiden, können Sie dieses Archiv höchstwahrscheinlich mit einem ganz normalen, alltäglichen tarAufruf wie dem folgenden generieren :

tar czf foo.tar.gz foo

Wo fooist das Verzeichnis, das alle Ihre 5 Millionen Dateien enthält.

In den anderen Antworten auf diese Frage finden Sie einige zusätzliche alternative tarBefehle, die Sie ausprobieren können, falls Sie das Ergebnis in mehrere Teile aufteilen möchten, usw.

Celada
quelle
15

"fünf Millionen" Dateien und insgesamt 1 TB? Ihre Dateien müssen also sehr klein sein. Ich würde einfach versuchen rsync:

rsync -alPEmivvz /source/dir remote.host.tld:/base/dir

Wenn Sie das nicht haben - oder Ihr Anwendungsfall es nicht zulässt rsync, würde ich zumindest prüfen, ob es 7zmit Ihren Daten funktioniert. Es könnte nicht sein, aber ich denke, es ist immer noch einen Versuch wert:

7z a archive.7z /source/dir

Oder wenn Sie sich 7zzumindest nicht wohl fühlen, wenn Sie versuchen, ein .tar.xzArchiv zu erstellen:

tar cJv archive.tar.xz /source/dir

(Es sollte beachtet werden, dass ältere Versionen von tarkeine .tar.xzArchive erstellen , aber .tar.lzmaArchive, wenn der JSchalter verwendet wird. Auch ältere Versionen von tarunterstützen das JFlag nicht insgesamt.)


Da Sie ein GUI-Programm zum Erstellen dieser Dateien verwenden, gehe ich davon aus, dass Sie sich mit einer Befehlszeilenschnittstelle etwas unwohl fühlen.

Um das Erstellen, Verwalten und Extrahieren von Archiven über die Befehlszeilenschnittstelle zu erleichtern, gibt es das kleine Hilfsprogramm atool. Es ist für praktisch jede gängige Distribution verfügbar, die ich gesehen habe, und funktioniert so ziemlich für jedes einzelne Archiv, auf das ich gestoßen bin, außer für die hoffnungslos dunklen.

Überprüfen Sie, ob Ihre Distribution über atoolRepos verfügt, oder bitten Sie Ihren Administrator, diese zu installieren, wenn Sie sich in einer Arbeitsplatzumgebung befinden.

atool Installiert eine Reihe von Symlinks in sich selbst, sodass das Packen und Entpacken zum Kinderspiel wird:

apack archive.tar.xz <files and/or directories>

Erstellt ein Archiv.

aunpack archive.7z

Erweitert das Archiv.

als archive.rar

Listet Dateiinhalte auf.

Welche Art von Archiv erstellt wird, atoolerkennt man an der Dateinamenerweiterung Ihres Archivs in der Kommandozeile.

Polemon
quelle
4
Der Vorteil bei der Verwendung rsyncist, dass, wenn (wann) die Verbindung unterbrochen wird, an der Stelle weitergearbeitet werden rsynckann, an der sie aufgehört hat.
Roaima
2
Die Dateien wären durchschnittlich 200 KB groß. Das ist gar nicht so klein.
Nate Eldredge
4
@ NateEldredge Ich denke normalerweise, dass groß> 1 GB bedeutet. Klein ist in der Regel <1 MB. So hübsch klein.
PythonNut
8

Sofern Sie nicht eine bessere Komprimierung als 25: 1 erzielen können, ist es unwahrscheinlich, dass Sie durch die Komprimierung vor dem Versenden per E-Mail etwas erreichen, es sei denn, Sie haben ein Hardware-Bandformat, mit dem Sie den Drittanbieter austauschen können.

Der größte gemeinsame Speicher ist Blue Ray und das bringt Ihnen ungefähr 40 GB. Sie benötigen eine 25: 1-Komprimierung Ihrer Daten, um sie darauf abzustimmen. Wenn Ihr Drittanbieter nur über eine DVD verfügt, benötigen Sie (ungefähr) 125: 1.

Wenn Sie mit diesen Komprimierungszahlen nicht übereinstimmen können, verwenden Sie einfach eine normale Disc, und senden Sie diese per Post an den Dritten. In diesem Fall ist der Versand von Daten, die kleiner als ein 1-TB-Laufwerk sind und eine Komprimierung erfordern, Wahnsinn.

Sie müssen dies nur mit der Verwendung von ssh -C(Standardkomprimierung) oder vorzugsweise rsyncmit der Komprimierung vergleichen, um die Dateien über das Netzwerk zu kopieren. 1 TB ist nicht unmöglich, sich über das Netz zu bewegen, aber es wird eine Weile dauern.

Anthon
quelle
5
+1: "Unterschätze niemals die Bandbreite eines Kombis voller Bänder, die die Autobahn entlang rasen" (Andrew S. Tanenbaum). siehe en.wikipedia.org/wiki/Sneakernet
Olivier Dulac
@OlivierDulac Ich habe ähnliche Konstrukte mit Boeing 747 und Kisten voller CD-ROMs gesehen. Es ist erstaunlich, welchen Durchsatz Sie damit erzielen können.
Anthon
Ich finde es toll, dass ein Pidgin einen ISP bei weitem besiegt, siehe die Beispiele auf der Wikipedia-Seite ^^
Olivier Dulac,
6

Hast du über Torrent nachgedacht? Peer-to-Peer ist möglicherweise die beste Option für eine Internetübertragung:

  • Mindestens so schnell wie andere Internetübertragungen: Ihre Upload-Geschwindigkeit bestimmt die Übertragungsgeschwindigkeit
  • Keine Datenbeschädigung
  • Wählen Sie aus, welche Dateien zuerst übertragen werden sollen
  • Es wird kein zusätzlicher lokaler / Cloud-Speicherplatz benötigt
  • Kostenlos

Sie haben nicht gesagt, welches Betriebssystem Sie verwenden, aber da Sie über die tar.gz-Komprimierung sprechen, gehe ich davon aus, dass Sie ein GNU / Linux-ähnliches Betriebssystem verwenden. Dafür schlage ich Transmission vor . Es ist eine Open-Source-Torrent-Software, die auf Mac und Linux läuft. Ich mag es, weil die Entwickler sich Mühe geben, es für jeden GUI-Client, den sie unterstützen, nativ zu machen: keine plattformübergreifende Sprache.

Sie können diese Methode mit der Komprimierung kombinieren, verlieren jedoch die Möglichkeit, Teile der Übertragung zu priorisieren.

Lax
quelle
Torrent-Software hat wahrscheinlich die gleichen Probleme mit der Komprimierung von GUI-Software. Speichern von Dateinamen usw. In Torrent-Dateien müssen auch die Metadaten der Dateien gespeichert werden. 5 Millionen Dateinamen sollten in die Torrent-Datei gepackt werden.
Ayesh K
@AyeshK Richtig, dies wirkt sich auf die Leistung beim Hinzufügen / Erstellen des Torrents oder beim Überprüfen der Prüfsummen aus. Dennoch glaube ich, dass dies die stabilste Lösung für die Übertragung großer Datenmengen ist.
LaX
Laut Torrent-Freak ist der größte jemals geteilte Torrent ~ 800 GB. Einzelne Torrent-Datei mit den meisten Dateien enthielt etwa 33K-Dateien. Aber 5 Millionen Dateien ... Ich bin nicht sicher.
Ayesh K
3

7z wäre meine Wahl. Es ermöglicht die automatische Aufteilung von Archiven und unterstützt die Multithread-Komprimierung. Nein, xztrotz der Hilfemeldung. Versuche es mit:

7za a -v100m -m0=lzma2 -mx=9 -ms=on -mmt=$THREADS archive.7z directory/

Der Ausgang ist in 100-MB-Blöcke aufgeteilt (ändern Sie ihn mit dem -vSchalter).

Der einzige wirkliche Nachteil ist, dass 7z keine Unix-Metadaten speichert (z. B. Berechtigungen und Eigentümer). Wenn Sie das brauchen, leiten Sie stattdessen die tarAusgabe in 7za(siehe man 7zafür einige Beispiele).

Stefano Sanfilippo
quelle
1
The only real downsideaber was für ein Nachteil!
njzk2
@ njzk2 eigentlich kommt es auf das szenario an. Wenn Sie beispielsweise Backup-Images oder Datenbank-Dumps senden, interessieren Sie die Berechtigungen wahrscheinlich nicht sehr.
Stefano Sanfilippo
Ich verstehe nicht ganz den Sinn, 7z zum Teilen zu verwenden, wenn Sie spliteine .tar.gz-Datei verwenden und die Metadaten behalten können.
njzk2
@ njzk2 es auch aufteilt. In erster Linie hat es eine Multithread-Komprimierung mit LZMA2. Kein anderes mir bekanntes Unix-Dienstprogramm unterstützt es. 7z hat auch einen nicht festen Komprimierungsmodus, was ein großer Fortschritt ist, wenn nur auf eine bestimmte Datei zugegriffen werden muss, um den tarAnsatz zu verfolgen .
Stefano Sanfilippo,
3

Ich habe mit der rechten Maustaste auf den Ordner geklickt und auf "Archiv erstellen" geklickt und die Option ".tar.gz" ausgewählt. Die Verzeichnisstruktur ist tief, über 500.000 Verzeichnisse

Ja, viel Glück beim Zusammenpacken. Und das GUI-Tool wird versuchen, dies auf demselben Volume zu tun, was bedeutet, dass a) Sie weitere 1 TB freien Speicherplatz benötigen und b) der Kopfschlag, wenn Sie eine Datei lesen und an das Archiv anhängen, für das Laufwerk nicht zu fehlerfrei ist.

Ich sehe zwei Möglichkeiten:

1) Rsync von Ihrem Computer an den Drittanbieter. Der eine oder andere benötigt eine globale IP-Adresse, die sich nicht oft ändert. Der große Vorteil von rsync ist, dass bei einer Unterbrechung aus irgendeinem Grund die Unterbrechung dort fortgesetzt werden kann, wo sie aufgehört hat. Das Kopieren eines 1-TB-Tarballs wird entweder erfolgreich sein oder fehlschlagen

2) Kaufen Sie ein externes 1-TB-Laufwerk, kopieren Sie die Daten darauf und lassen Sie das Laufwerk ausliefern. Hohe Latenz, aber wirklich gute Bandbreite, wenn es ankommt. Diverse Online-Backup-Dienste stehen dazu für die Erstsicherung zur Verfügung.

paul
quelle
1
Obligatorische XKCD .
PythonNut
1

Ich schlage vor, Sie verwenden etwas wie:

tar -c -L 104857600 -f file1.tar -f file2.tar -f file3.tar -f file4.tar -f file5.tar -f file6.tar -f file7.tar -f file8.tar -f file9.tar -f file10.tar 
gzip file*.tar

Dadurch werden 10 Dateien erstellt, die maximal 100 GB groß sind. Aber das würde Ihr "OOM" -Problem nicht beantworten, da tar Lese- / Schreibzugriff streamen soll, sodass der Engpass eindeutig "gzip" ist.

mveroone
quelle
0

Wie ist es damit:

find /path | tar -T - -czf - | ssh remotehost "cd /target/dir/; tar xzf -"
  • find Suchen listet den Verzeichnisbaum auf
  • tar -T - liest die liste von stdin
  • -czf -zErstellt ein Archiv und schreibt nach stdout, gzippt den Stream
  • ssh remotehost Melden Sie sich bei Remotehost mit an ssh
  • cd /target/dir/ Wechseln Sie in das Zielverzeichnis
  • tar xzf - extrahiere den eingehenden Stream aus stdin
Chaos
quelle
Netter kleiner Ausschnitt. Obwohl ich denke, dass sein Bedürfnis hier hauptsächlich die Komprimierungsfunktion ist, da der Zweck darin besteht, "an einen Freund zu übertragen"
mveroone
Die unvollständige Erstellung des Archivs schadet, wenn die Verbindung unterbrochen wird, was bei der Übertragung von 1 TB nicht völlig unwahrscheinlich ist, entweder aufgrund eines Netzwerkausfalls (es gibt immer noch ISPs, die Sie alle 24 Stunden trennen) oder aus anderen Gründen.
Jonas Schäfer,