La find(1)
utilidad Unix es muy útil, ya que me permite realizar una acción en muchos archivos que coinciden con ciertas especificaciones, p. Ej.
find /dump -type f -name '*.xml' -exec java -jar ProcessFile.jar {} \;
Lo anterior podría ejecutar un script o herramienta sobre cada archivo XML en un directorio particular.
Digamos que mi script / programa requiere mucho tiempo de CPU y tengo 8 procesadores. Sería bueno procesar hasta 8 archivos a la vez.
GNU make permite el procesamiento de trabajos paralelos con el -j
indicador, pero find
no parece tener dicha funcionalidad. ¿Existe un método genérico alternativo de programación de trabajo para abordar esto?
-P
opción!xargs -P
: tiene un error nunca corregido de desviar la salida (a diferenciaparallel
) cada vez que 2 hilos producen salida en el mismo momento exacto ...GNU paralela también puede ayudar.
Tenga en cuenta que sin el
-j8
argumento,parallel
el número predeterminado de núcleos en su máquina :-)fuente
No es necesario "arreglar"
find
: hacer uso demake
sí mismo para manejar el paralelismo.Haga que su proceso cree un archivo de registro o algún otro archivo de salida, y luego use un Makefile como este:
e invocado así:
Mejor aún, si se asegura de que el archivo de salida solo se crea al completar con éxito el proceso de Java, puede aprovechar
make
el manejo de dependencias para garantizar que la próxima vez solo se realicen los archivos no procesados.fuente
Buscar tiene una opción paralela que puede usar directamente usando el símbolo "+"; No se requieren xargs. Combinándolo con grep, puede atravesar su árbol rápidamente buscando coincidencias. por ejemplo, si estoy buscando todos los archivos en mi directorio de fuentes que contienen la cadena 'foo', puedo invocar
find sources -type f -exec grep -H foo {} +
fuente
-exec command +
sintaxis no se ejecuta en paralelo, sino que "agrupa" muchos archivos y ejecuta el comando con varios archivos como argumentos al mismo tiempo. Sucede que grep puede mirar a través de sus objetivos en paralelo.