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
Antworten:
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.
quelle
Wenn ich die Ausfallzeit arrangieren könnte, würde ich die Festplatte einfach vorübergehend verschieben.
quelle
Haben Sie versucht, find und -exec (oder xargs) zu verwenden?
?
quelle
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
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.
quelle
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.
quelle
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
quelle
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.
quelle
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:
quelle