55 votos

Una mejor unix encontrar con el procesamiento en paralelo?

El unix find(1) utilidad es muy útil lo que me permite realizar una acción en muchos de los archivos que coinciden con ciertas especificaciones, por ejemplo,

find /dump -type f -name '*.xml' -exec java -jar ProcessFile.jar {} \;

La anterior puede ejecutar una secuencia de comandos de la herramienta o sobre cada archivo XML en un directorio en particular.

Digamos que mi script/programa tiene un montón de tiempo de CPU y tengo 8 procesadores. Sería bueno para procesar hasta 8 archivos al mismo tiempo.

GNU make permite el trabajo en paralelo de procesamiento con la -j flag pero find no tiene esa funcionalidad. Hay una alternativa genérica de trabajo-método de programación de acercarse a este?

74voto

Gaius Puntos 666

xargs con la -P opción (número de procesos). Decir que me quería para comprimir todos los ficheros en un directorio en un 4-cpu de la máquina:

find . -name '*.log' -mtime +3 -print0 | xargs -0 -P 4 bzip2

También se puede decir -n <number> para el número máximo de trabajo-unidades por proceso. Así que decir que yo tuve 2500 archivos y me dijo:

find . -name '*.log' -mtime +3 -print0 | xargs -0 -n 500 -P 4 bzip2

Este sería el inicio de 4 bzip2 procesos, cada uno de los cuales con más de 500 archivos y, a continuación, cuando el primero de terminar otro habría iniciado en los últimos 500 archivos.

No sé por qué la respuesta anterior utiliza xargs y make, usted tiene dos motores en paralelo allí!

46voto

robertc Puntos 118

GNU paralelo , también puede ayudar.

find /dump -type f -name '*.xml' | parallel -j8 java -jar ProcessFile.jar {}

Tenga en cuenta que sin la -j8 argumento, parallel valores predeterminados para el número de núcleos en su máquina :-)

7voto

Joey deVilla Puntos 4487

No hay necesidad de "arreglar" find - hacer uso de make sí para controlar el paralelismo.

Tiene su proceso de crear un archivo de registro o algún otro archivo de salida y, a continuación, utilizar un archivo Makefile como este:

.SUFFIXES:  .xml .out

.xml.out:
        java -jar ProcessFile.jar $< 1> $@

y se invoca así:

find /dump -type f -name '*.xml' | sed -e 's/\.xml$/.out/' | xargs make -j8

Mejor aún, si se asegura de que el archivo de salida sólo se crea en la finalización con éxito del proceso Java usted puede tomar ventaja de la make's de la dependencia de manejo para asegurar que la próxima vez sólo sin procesar archivos de hacer.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: