Gzip großes Verzeichnis in separate .gz-Dateien für die ssh-Übertragung

391
pir

Ich habe ein Verzeichnis von ~ 200.000 .npy-Dateien mit einer Gesamtgröße von ~ 100 GB. Alle Dateien werden direkt unter dem Hauptverzeichnis gespeichert (dh es gibt keine Unterverzeichnisse). Ich muss das Verzeichnis übertragen und möchte es tun, indem ich es zunächst in eine kleinere Anzahl von gzip-Dateien komprimiere, die ich dann mit ssh übertrage. Ich habe versucht, das gesamte Verzeichnis auf einmal naiv zu gzipieren, wodurch mein Server einfriert und ein Neustart erforderlich ist.

Wie kann ich das Verzeichnis der Dateien einfach in 1000 .gz-Dateien gzipieren, die ich dann problemlos übertragen und erneut entpacken kann?

Ich möchte dies vorzugsweise auf eine Art und Weise tun, bei der der maximale Ressourcenverbrauch auf dem Server an einem bestimmten Punkt (hauptsächlich RAM / IO) hinsichtlich der Eigenschaften des Verzeichnisses (Gesamtgröße / Anzahl der Dateien) unabhängig ist. Ich hoffe, dass ich eine Methode finden kann, die ich mit noch größeren Verzeichnissen verwenden kann, ohne dass mein Server einfriert. Die Lösung sollte vorzugsweise bash oder Python verwenden. Vielen Dank!

2
Wenn Sie versucht haben, das gesamte Verzeichnis zu komprimieren, was genau haben Sie getan? Daniel B vor 7 Jahren 0

1 Antwort auf die Frage

2
user4815162342

Dies scheint eine gute Übereinstimmung zu sein rsync. Der Inhalt wird transparent komprimiert, und es kann gesagt werden, dass er die Bandbreitennutzung einschränken soll. Dies dient sowohl der Vermeidung von Verstopfungen des Netzwerks als auch der Vermeidung einer hohen E / A-Belastung des Ursprungsservers:

rsync -az --bwlimit=1m directory server:/destination/ 

-aweist rsyncan, die Metadaten der Datei zu kopieren, z. B. Erstellungszeiten, -zbedeutet Komprimierung und --bwlimitbegrenzt die im Netzwerk verwendete Bandbreite.

rsyncWenn Sie den Vorgang aus irgendeinem Grund unterbrechen und erneut ausführen, wird er als zusätzlicher Bonus automatisch dort eingesetzt, wo er aufgehört hat. Wenn Sie am Zielort zusätzliche Dateien löschen müssen, fügen Sie die --deleteOption hinzu.

Dies ist ein guter Vorschlag, aber was ist, wenn auf dem Zielserver kein rsync installiert ist? Alessandro Dotti Contra vor 7 Jahren 0
@adc `rsync` wird normalerweise auf Linux-Servern installiert. Wenn Sie auf einen stolpern, der es nicht hat, würde ich vorschlagen, tar czf - verzeichnis | zu kombinieren ssh remote 'cd destination && tar xf -'`. Wenn dies zu schnell läuft und der Ursprungsserver eine hohe IO-Last verursacht, fügen Sie zwischen dem ersten `tar` und` ssh` 'throttle -m 1' hinzu. (Sie müssen das Dienstprogramm `Throttle 'installieren, jedoch nur auf dem Client.) user4815162342 vor 7 Jahren 1
Ich bin damit einverstanden, dass rsync zu fast allen Standardinstallationen von Linux-Servern gehört, aber man kann sich vorher nicht sicher sein, da einige Systemadministratoren alles entfernen, was nicht unbedingt erforderlich ist. Nur um der Diskussion willen, weil wir uns von der ursprünglichen Frage entfernen. Alessandro Dotti Contra vor 7 Jahren 0
@adc Wahr genug. Ohne "rsync" würde ich auf die "te" -basierte Lösung setzen. Wenn Sie möchten, kann ich das als separate Antwort posten. user4815162342 vor 7 Jahren 0
Sie können Ihre Antwort bearbeiten und erweitern, wenn Sie möchten. Ich leite beide Ihre Lösungen ab. Alessandro Dotti Contra vor 7 Jahren 0
Sieht gut aus! Es ist sinnvoll, diesen Ansatz zu verwenden, anstatt zu kippen. Ich habe jedoch versucht, das auszuführen, und bisher wurde es nur an der Konsole angehalten. Wissen Sie, was eine vernünftige Zeit für die Initialisierung und den Beginn der Synchronisation ist? pir vor 7 Jahren 0
@pir 200k enthält viele Dateien; Wenn Sie sich nicht sicher sind, fügen Sie das '-v' hinzu, um zu sehen, was Rsync macht. user4815162342 vor 7 Jahren 1