Bash: parallelisieren, die md5sum-Prüfsumme auf viele Dateien
können sagen, ich habe ein 64-core-server, und ich brauche, um zu berechnen md5sum
alle Dateien in /mnt/data
, und speichern Sie die Ergebnisse in eine text-Datei:
find /mnt/data -type f -exec md5sum {} \; > md5.txt
Das problem mit dem obigen Befehl ist, dass immer nur ein Prozess läuft zu einem bestimmten Zeitpunkt. Möchte ich nutzen die volle Kraft meines 64-Kerne. Im Idealfall würde ich gerne stellt sicher, dass zu jedem gegebenen Zeitpunkt, 64 parallel md5
Prozesse ausgeführt werden (aber nicht mehr als 64).
Auch. Ich bräuchte die Ausgabe von allen Prozessen für die Speicherung in einer Datei.
HINWEIS: ich bin nicht auf der Suche nach einem Weg, um zu berechnen md5sum
einer Datei parallel. Ich bin auf der Suche nach einem Weg, um zu berechnen, 64 md5sums von 64 unterschiedliche Dateien parallel, solange es irgendwelche Dateien, die aus find
.
- Ich bin nicht sicher, es wird gut sein. Ich könnte mir vorstellen, dass das Zeug wird E / a-gebunden, sehr schnell und, dass die Verwendung von 64-Prozesse führen zu slooow IO während viele Kerne im Leerlauf trotzdem.
- Aber auf der anderen Seite, modernen Datei-Systeme zwischengespeichert werden viel im RAM, also mehr als ein zu einer Zeit Sinn macht.
- der kernel wird immer noch zum abrufen der Daten in den RAM, so dass der Engpass bleibt.
- Ich bin daran interessiert, eine generalisierte Antwort. Wenn die md5sum ist zu schnell für Sie (cca 90 MB/s), als fühlen Sie sich frei, um die Vertretung eines langsamen Algorithmus (xz-Kompression 5MB/s). Es ist nicht unrealistisch anzunehmen, dass die lese-Geschwindigkeit von /mnt/Daten 500MB/s (ie, NFS über 10-GBit-Netzwerk -, oder SSD-Festplatte)
- Falls die Daten bereits im RAM (denken Sie an die große Server mit z.B. 96 GB RAM), dass Sie vielleicht schon passiert ist.
- Wenn die OP wollen eine Lösung für parallel läuft, warum jemand zu sprechen beginnen, über die "falsche Idee"? Vielleicht hat er einfach einmal testen möchten die I/O-Engpass oder was auch immer... Einfach nicht verstehen, die alles besser weis-Nutzer... (urbandictionary.com/...)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
GNU parallel
. Und finden Sie einige weitere Beispiele auf, wie es zu implementieren hier.time find /mnt/data -type f | parallel -j 16 md5sum > md5.txt
ist etwa 3 mal langsamer als normal findentime find /usr/share -type f -exec md5sum {} \; > md5.txt
.Können Sie xargs als gut, Es könnte mehr zur Verfügung als parallels auf einige distro.
-P steuert die Anzahl der Prozess hervorgebracht.
Wenn Sie möchten, Experimentieren Sie versuchen, installieren Sie die
md5deep
. (http://md5deep.sourceforge.net)Hier ist die Anleitung , wo man Lesen kann:
Wenn dies nicht hilft, müssen Sie die I/O-Engpass.
AKTUALISIERT
Wenn Sie nicht möchten, verwenden Sie zusätzliche Pakete, die Sie können versuchen, die sg wie diese:
Ersten, die es ermöglicht, zu erhalten SIGCHLD, wenn ein Teilprozess beendet. Wenn SIGCHLD es findet die erste nicht-vorhandenen Prozess-und entfernt von
cpid
array.In der for-Schleife, beginnt es
max
Anzahl dersome_long_process
Prozesse asynchron. Esmax
erreicht er fragt alle pids Hinzugefügtcpid
array. Es wartet, biscpid
's Länge ist weniger dannmax
und beginnt einige weitere Prozesse asynchron.Wenn die Liste vorbei ist, dann wartet, bis alle Kinder fertig zu stellen.
HINZUGEFÜGT
Endlich habe ich gefunden eine richtige machen Lösung hier.
sleep 1
Zeile entfernt werden konnte. Es wird unnötig einen core belasten. Versuchen Sie, die Art und Weise. Vielleicht könnte Man ein wenig verbessern etwas mitfind /mnt/data -type f -exec md5sum {} + > md5.txt
. Geist der nachfolgende+
statt;
! Dies ruftmd5sum
viel weniger Zeit. (siehe-exec command {} +
im find(1)).