Ich xargs
rufe ein Python-Skript auf, um ungefähr 30 Millionen kleine Dateien zu verarbeiten. Ich hoffe, xargs
den Prozess parallelisieren zu können. Der Befehl, den ich benutze, ist:
find ./data -name "*.json" -print0 |
xargs -0 -I{} -P 40 python Convert.py {} > log.txt
Grundsätzlich Convert.py
wird in einem kleinen lesen json - Datei (4kb), einige Verarbeitung und Schreiben auf eine andere 4kb Datei. Ich laufe auf einem Server mit 40 CPU-Kernen. Auf diesem Server wird kein anderer CPU-intensiver Prozess ausgeführt.
Durch die Überwachung von htop (gibt es übrigens eine andere gute Möglichkeit, die CPU-Leistung zu überwachen?) Finde ich, dass dies -P 40
nicht so schnell ist wie erwartet. Manchmal frieren alle Kerne ein und fallen 3-4 Sekunden lang fast auf Null ab, dann erholen sie sich auf 60-70%. Dann versuche ich, die Anzahl der parallelen Prozesse zu verringern -P 20-30
, aber es ist immer noch nicht sehr schnell. Das ideale Verhalten sollte eine lineare Beschleunigung sein. Irgendwelche Vorschläge für die parallele Verwendung von xargs?
xargs -P
und >
öffnet sich für Rennbedingungen aufgrund des Halblinienproblems gnu.org/software/parallel/… Die Verwendung von GNU Parallel wird dieses Problem nicht haben.