Kopieren Sie 10 Millionen Bilder in einem einzelnen Ordner auf einen anderen Server

7

Jetzt weiß ich, dass Sie niemals 10 Millionen Dateien in einem einzigen Verzeichnis ablegen sollten. Schuld daran sind die Entwickler, aber so wie es aussieht, bin ich dort. Wir werden es reparieren und in Ordnergruppen verschieben, aber zuerst müssen wir sie von der Produktionsbox kopieren lassen.

Ich habe zuerst versucht, rsync, aber es würde kläglich scheitern. Ich nehme an, das lag daran, dass das Speichern des Namens und des Pfads der Dateien im Speicher größer war als der RAM- und Swap-Speicherplatz.

Dann habe ich versucht, alles in ein tar.gz zu komprimieren, aber es konnte es nicht entpacken, Datei zu großer Fehler (es war 60gigs).

Ich habe versucht, nur eine Teer-zu-Teer-Exaktion durchzuführen, aber ich habe die Meldung "Kann nicht öffnen: Datei zu groß" erhalten.

tar c images/ | tar x –C /mnt/coverimages/

Zusatzinformation:

/ mnt / coverimages / ist eine NFS-Freigabe, in die wir die Bilder verschieben möchten.

Alle Dateien sind Bilder

OS: Gentoo

Der digitale Ninja
quelle
4
Vielleicht eine dumme Frage, aber wenn Sie sie nicht kopieren können, wie machen Sie ein Backup? Können Sie einfach eine Wiederherstellung am neuen Standort durchführen?
Zoredache

Antworten:

15

Wenn Sie Version 3+ von rsync installieren, wird eine fortlaufende Liste der zu übertragenden Dateien erstellt, und es muss nicht die gesamte Dateiliste im Speicher gehalten werden. In Zukunft möchten Sie wahrscheinlich die Dateinamen hashen und eine Verzeichnisstruktur erstellen, die auf Teilen dieser Hashes basiert.

Sie können diese Antwort sehen , um eine Vorstellung davon zu bekommen, was ich mit dem Hashing meine.

Kyle Brandt
quelle
3

Wenn ich die Ausfallzeit arrangieren könnte, würde ich die Festplatte einfach vorübergehend verschieben.

Chopper3
quelle
2
oder machen Sie einen Block-Level-Klon der Festplatte
Matthew
1

Haben Sie versucht, find und -exec (oder xargs) zu verwenden?

find images/ -exec cp "{}" /mnt/coverimages/ \;

?

Golemwashere
quelle
1

Ich denke nicht ganz, dass Sie den Befehl "tar | tar" ganz richtig haben. Versuche dies

tar cf - images/ | cd /mnt/coverimages && tar xf -

Eine andere Möglichkeit wäre, über SSH zu streamen (etwas CPU-Overhead für die Verschlüsselung):

tar cf - images/ | ssh user@desthost "cd /path/coverimages && tar xf -"

Es gibt auch cpio, das etwas dunkler ist, aber ähnliche Funktionen bietet:

find images/ | cpio -pdm /mnt/coverimages/


quelle
0

Ich würde mir vorstellen, dass Ihre beiden Optionen darin bestehen, den Dateisatz schrittweise zu verschieben, indem Sie reguläre Ausdrücke verwenden, um Dateinamen abzugleichen, oder das Dateisystem aushängen und das gesamte Gerät kopieren.

Beeindruckend. Viel Glück.

Matt Simmons
quelle
Schlage meine Antwort um 20 Sekunden!
Luke hat keinen Namen
0

Segmentieren Sie Ihre Rsyncs oder das von Ihnen verwendete Tool in mehrere Jobs. Wenn die Dateien mit einer Logik oder Nummerierung benannt sind, können Sie das System anweisen, die X-Anzahl der Dateien gleichzeitig zu synchronisieren.

Luke hat keinen Namen
quelle
Ich habe diese Technik in der Vergangenheit verwendet und die Erstellungszeit der Datei als Segmentierungskriterium verwendet. Dies vermeidet die Notwendigkeit logischer oder sequentieller Dateinamen und setzt voraus, dass die Dateien über einen längeren Zeitraum erstellt wurden. Grob: Für ($ interval = 1..large number) finden Sie ctime kleiner als $ interval vor; etwas tun ; $ interval ++.
AndyN
0

Wenn Sie bereits ein NFS-Mount haben, würde ein einfaches cp -au nicht ausreichen?

Ich glaube, ein Tar-over-Netzwerk (ssh oder netcat) könnte schneller sein (weniger Wartezeiten auf Hin- und Rückfahrten).

Untersuchen Sie Ionice auch im Voraus - Ihre Produktionsbenutzer werden es Ihnen danken

Joris
quelle
0

Ein Hinweis: Klassischerweise waren NFS-Schreibvorgänge synchron, sodass die Leistung besser wäre, wenn Sie das Verzeichnis, aus dem Sie lesen, exportieren und dann lokal schreiben würden.

Ich denke, die Suchlösung ist die beste Wahl (hmmm, ich frage mich, ob ich nohup oder ähnliches verwenden und einen Hintergrundprozess erzeugen soll, um die Dinge ein wenig zu beschleunigen, aber das ist vielleicht kein Gewinn). Suchen bedeutet, dass Sie nur durch das Verzeichnis gehen und mit jeder Datei so umgehen, wie Sie sie finden, was bedeutet, dass Sie nie an die gesamte Liste der Dateien denken.

Ronald Pottol
quelle
0

Gibt es möglicherweise eine Möglichkeit, alle Dateien in separate Verzeichnisse zu trennen und dann ein einzelnes Verzeichnis zu erstellen, das nur feste Links zu diesen Dateien enthält? Auf diese Weise können Ihre Entwickler auf die Dateien entweder als einzelnes Verzeichnis oder als separate Verzeichnisse (z. B. nach Monat getrennt) zugreifen:

/home/user/directory/file1-slink
/home/user/directory/file2-slink

/home/user/dir-month-07/file1
/home/user/dir-month-06/file2
Djangofan
quelle