Estoy usando xargs
para llamar a un script de Python para procesar unos 30 millones de archivos pequeños. Espero usar xargs
para paralelizar el proceso. El comando que estoy usando es:
find ./data -name "*.json" -print0 |
xargs -0 -I{} -P 40 python Convert.py {} > log.txt
Básicamente, Convert.py
leerá en un pequeño archivo json (4kb), procesará y escribirá en otro archivo de 4kb. Estoy corriendo en un servidor con 40 núcleos de CPU. Y no se está ejecutando ningún otro proceso intenso de CPU en este servidor.
Al monitorear htop (por cierto, ¿hay alguna otra buena manera de monitorear el rendimiento de la CPU?), Encuentro que -P 40
no es tan rápido como se esperaba. A veces, todos los núcleos se congelarán y disminuirán casi a cero durante 3-4 segundos, luego se recuperarán al 60-70%. Luego trato de disminuir el número de procesos paralelos -P 20-30
, pero aún no es muy rápido. El comportamiento ideal debe ser la aceleración lineal. ¿Alguna sugerencia para el uso paralelo de xargs?
xargs -P
y se >
está abriendo para condiciones de carrera debido al problema de media línea gnu.org/software/parallel/… Usar GNU Parallel en su lugar no tendrá ese problema.