2012-01-24 45 views
6

Las CPU actuales generalmente comprenden varios núcleos físicos. Estos incluso pueden ser de subprocesos múltiples para que el kernel de Linux vea un número bastante grande de núcleos y en consecuencia inicie varias veces el programador de Linux (uno para cada núcleo). Cuando se ejecutan varias tareas en un sistema Linux, el programador normalmente logra una buena distribución de la carga de trabajo total para todos los núcleos de Linux (podría ser el mismo núcleo físico).¿Cómo paralelizar (trivialmente) con el shell de Linux iniciando una tarea por núcleo de Linux?

Ahora, digo, tengo una gran cantidad de archivos para procesar con el mismo ejecutable. Yo suelo hacer esto con el comando "buscar":

find <path> <option> <exec> 

Sin embargo, esto comienza una sola tarea en cualquier momento y espera hasta su finalización antes de iniciar la siguiente tarea. Por lo tanto, solo se usa un núcleo en cualquier momento para esto. Esto deja la mayoría de los núcleos inactivos (si este comando de búsqueda es la única tarea que se ejecuta en el sistema). Sería mucho mejor lanzar N tareas al mismo tiempo. Donde N es la cantidad de núcleos vistos por el kernel de Linux.

¿Hay algún comando que haga eso?

+1

Eche un vistazo a la utilidad paralela GNU. No sé cómo encaja en su problema particular, pero lea: http://www.gnu.org/software/parallel/ –

+1

Sí, tiene razón. El paralelo GNU está diseñado para este uso. Se puede usar como reemplazo de "xargs". – ritter

+0

@Daniel: parece que deberías publicar eso como respuesta. –

Respuesta

7

Use find con la opción -print0. Tírela a xargs con la opción -0. xargs también acepta la opción -P para especificar una cantidad de procesos. -P se debe utilizar en combinación con -n o -L.

Lea man xargs para obtener más información.

Un comando de ejemplo: find . -print0 | xargs -0 -P4 -n4 grep searchstring

+0

¡Muchas gracias por la respuesta! Como GNU paralelo no es un componente de mi distribución, xargs es la elección (¡por el momento!). – ritter

2

Si tiene GNU paralelo http://www.gnu.org/software/parallel/ instalado se puede hacer esto:

find | parallel do stuff {} --option_a\; do more stuff {} 

Usted puede instalar en paralelo GNU simplemente por:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 

reloj de la videos introductorios para GNU Paralelo para obtener más información: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

+0

Grandes videos introductorios. ¡¡Muchas gracias!! Desafortunadamente, el paralelo GNU aún no llegó a Ubuntu 11.10. Increíble, una gran herramienta! Sin embargo, he leído indicios de que llegará a 12.04. ¡¡Buenas noticias!! – ritter

+0

No está en http://www.ubuntuupdates.org/package_metas/list?name=parallel, así que me pregunto dónde leer esas sugerencias. –

0

Gnu paralelo o xargs -P es probablemente una mejor manera de manejar esto, pero también puede escribir un tipo de estructura multitarea en bash. Sin embargo, es un poco desordenado y poco confiable debido a la falta de ciertas instalaciones.

#!/bin/sh 

MAXJOBS=3 
CJ=0 
SJ="" 

gj() { 
    echo ${1//[][-]/} 
} 

endj() { 
    trap "" sigchld 
    ej=$(gj $(jobs | grep Done)) 
    jobs %$ej 
    wait %$ej 
    CJ=$(($CJ - 1)) 
    if [ -n "$SJ" ]; then 
     kill $SJ 
     SJ="" 
    fi 
} 
startj() { 
    j=$* 
    while [ $CJ -ge $MAXJOBS ]; do 
     sleep 1000 & 
     SJ=$! 
     echo too many jobs running: $CJ 
     echo waiting for sleeper job [$SJ] 
     trap endj sigchld 
     wait $SJ 2>/dev/null 
    done 
    CJ=$(($CJ + 1)) 
    echo $CJ jobs running. starting: $j 
    eval "$j &" 
} 

set -m 

# test 
startj sleep 2 
startj sleep 10 
startj sleep 1 
startj sleep 1 
startj sleep 1 
startj sleep 1 
startj sleep 1 
startj sleep 1 
startj sleep 2 
startj sleep 10 

wait 
Cuestiones relacionadas