2009-06-11 25 views
6

En mi aplicación web, renderizo páginas usando script PHP, y luego genero archivos HTML estáticos de ellas. El HTML estático se sirve a los usuarios para acelerar el rendimiento. Los archivos HTML se vuelven obsoletos y deben borrarse.Que es más rápido, 'find -exec' o 'find | xargs -0 '?

Estoy debatiendo entre dos formas de escribir el guión de desalojo.

El primero es el uso de un único comando find, como

find /var/www/cache -type f -mmin +10 -exec rm \{} \; 

La segunda forma es mediante la canalización a través xargs, algo así como

find /var/www/cache -type f -mmin +10 -print0 | xargs -0 rm 

La primera forma invoca rm para cada archivo que encuentra, mientras que la segunda forma simplemente envía todos los nombres de archivo a un solo rm (pero la lista de archivos puede ser muy larga).

¿Qué forma sería más rápida?

En mi caso, el directorio de caché se comparte entre unos pocos servidores web, por lo que todo esto se hace a través de NFS, si eso es importante para este problema.

Respuesta

6

Espero que la versión de xargs sea ligeramente más rápida ya que no está generando un proceso para cada nombre de archivo. Pero, me sorprendería si realmente hubiera mucha diferencia en la práctica. Si le preocupa la larga lista que xargs envía a cada invocación de rm, puede usar -l con xargs para limitar la cantidad de tokens que usará. Sin embargo, xargs conoce la longitud más larga de cmdline y no irá más allá de eso.

+3

Creo que xargs generará automáticamente (sin -l) varios procesos si el número de argumentos es mayor que el máximo del shell. – MatthieuP

+0

Gracias. No sabía que Xargs puede hacer eso. – yhager

13

La versión xargs es mucho más rápido con una gran cantidad de archivos que la versión -exec tan informados, esto se debe a que rm se ejecuta una vez para cada archivo que desea eliminar, mientras que se xargs agrupar tantos archivos como posible juntos en un solo comando rm.

Con decenas o cientos de miles de archivos, puede ser la diferencia entre un minuto o menos en comparación con la mayor parte de una hora.

Puede obtener el mismo comportamiento con -exec terminando el comando con un "+" en lugar de "\;". Esta opción solo está disponible en las versiones más recientes de find.

Los dos siguientes son más o menos equivalentes:

find . -print0 | xargs -0 rm 
find . -exec rm \{} + 

Tenga en cuenta que la versión xargs seguirá funcionando un poco más rápido (en un pequeño porcentaje) en un sistema multiprocesador, porque parte del trabajo se puede parallelized. Esto es particularmente cierto si se trata de una gran cantidad de cálculos.

+1

Encontré xargs una manera más rápida de ir. Pasé los primeros 250,000 archivos que tomaron casi dos horas. Luego tropecé con este SO e intenté con xargs. ¡Completaste el resto de los 750,000 en media hora como un campeón! – bbbco

+0

'-exec ...+ 'es parte del estándar POSIX para' encontrar'; el apoyo para ello debería ser bastante generalizado. – chepner