J'utilise xargs
pour appeler un script python pour traiter environ 30 millions de petits fichiers. J'espère utiliser xargs
pour paralléliser le processus. La commande que j'utilise est:
find ./data -name "*.json" -print0 |
xargs -0 -I{} -P 40 python Convert.py {} > log.txt
Fondamentalement, Convert.py
lira dans un petit fichier json (4 Ko), effectuera un certain traitement et écrit dans un autre fichier 4 Ko. Je cours sur un serveur avec 40 cœurs CPU. Et aucun autre processus gourmand en CPU n'est en cours d'exécution sur ce serveur.
En surveillant htop (btw, existe-t-il un autre bon moyen de surveiller les performances du processeur?), Je trouve que ce -P 40
n'est pas aussi rapide que prévu. Parfois, tous les cœurs gèlent et diminuent presque à zéro pendant 3-4 secondes, puis récupèrent à 60-70%. Ensuite, j'essaie de diminuer le nombre de processus parallèles à -P 20-30
, mais ce n'est toujours pas très rapide. Le comportement idéal devrait être une accélération linéaire. Des suggestions pour l'utilisation parallèle de xargs?
xargs -P
et >
s'ouvre pour des conditions de course en raison du problème de demi-ligne gnu.org/software/parallel/… Utiliser GNU Parallel à la place n'aura pas ce problème.