
Ich habe eine Liste von Dateien, die ich auf ein Linux-System kopieren muss – jede Datei ist zwischen 10 und 100 GB groß.
Ich möchte nur in das lokale Dateisystem kopieren. Gibt es eine Möglichkeit, dies parallel zu tun - mit mehreren Prozessen, die jeweils für das Kopieren einer Datei verantwortlich sind - in einemeinfachBenehmen?
Ich kann hierfür problemlos ein Multithread-Programm schreiben, möchte aber gerne herausfinden, ob es hierfür eine Linux-Low-Level-Methode gibt.
Antwort1
Wenn Ihr System nicht davon überlastet wird (z. B. wenn die Dateien im Cache sind), dann GNU Parallelhttp://www.gnu.org/software/parallel/könnte für Sie funktionieren:
find . -type f -print0 | parallel -0 -j10 cp {} destdir
Dadurch werden 10 cp
Sekunden gleichzeitig ausgeführt.
Pro: Es ist einfach zu lesen.
Nachteil: GNU Parallel ist auf den meisten Systemen nicht Standard, Sie müssen es also wahrscheinlich installieren.
Wenn Sie die Verzeichnisstruktur beibehalten möchten:
find . -type f -print0 |
parallel -0 -j10 mkdir -p destdir/{//}';' cp {} destdir/{//}
Weitere Informationen finden Sie im Einführungsvideo:http://www.youtube.com/watch?v=OpaiGYxkSuQ
Siehe auchhttps://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/für eine Diskussion über parallele Festplatten-E/A.
Antwort2
Aus einem ganz einfachen Grund gibt es hierfür keinen Low-Level-Mechanismus: Dadurch wird die Systemleistung beeinträchtigt. Bei Plattenlaufwerken muss jeder Schreibvorgang um die Platzierung des Kopfes konkurrieren, was zu massiven I/O-Wartezeiten führt. Bei SSDs führt dies zur Sättigung eines oder mehrerer Ihrer Systembusse, was weitere Probleme verursacht.
Antwort3
Wie gesagt, das ist eine schreckliche Idee. Aber ich finde, jeder sollte seine eigenen schrecklichen Pläne umsetzen können, also...
for FILE in *;do cp $FILE <destination> &;done
Das Sternchen kann durch einen regulären Ausdruck Ihrer Dateien ersetzt werden, oder $(cat <listfile>)
wenn Sie alle Dateien in einem Textdokument haben. Das Et-Zeichen startet einen Befehl im Hintergrund, sodass die Schleife fortgesetzt wird und weitere Kopien erstellt.
Wie erwähnt wird dies Ihr IO vollständig zerstören. Also ... ich würde es wirklich nicht empfehlen.
--Christopher Karel
Antwort4
Hier ist ein verteiltes/paralleles und dezentralisiertes Dateikopiertool, das die Datei in Blöcke aufteilt und alle Blöcke parallel kopiert. Es wird Ihnen wahrscheinlich nur helfen, wenn Sie eine SSD haben, die mehrere Streams unterstützt, oder eine Art Setup mit mehreren Plattenköpfen.