2009-06-11 6 views
6

Nella mia applicazione Web eseguo il rendering di pagine utilizzando lo script PHP e quindi generi file HTML statici. L'HTML statico viene offerto agli utenti per velocizzare le prestazioni. Alla fine i file HTML diventano obsoleti e devono essere eliminati.Quale è più veloce, "trova -exec" o "trova | xargs -0 '?

Sto discutendo tra due modi per scrivere lo script di sfratto.

Il primo utilizza un unico comando find, come

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

La seconda forma è convogliando attraverso xargs, qualcosa come

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

La prima forma invoca rm per ogni file che trova, mentre il secondo modulo invia semplicemente tutti i nomi dei file a un singolo rm (ma l'elenco dei file potrebbe essere molto lungo).

Quale forma sarebbe più veloce?

Nel mio caso, la directory della cache è condivisa tra alcuni server Web, quindi questo è tutto fatto su NFS, se questo è importante per questo problema.

risposta

6

Mi aspetto che la versione xargs sia leggermente più veloce in quanto non si genera un processo per ciascun nome file. Ma sarei sorpreso se ci fosse davvero molta differenza nella pratica. Se sei preoccupato che il lungo elenco di xargs possa essere inviato ad ogni chiamata di rm, puoi usare -l con xargs per limitare il numero di token che userà. Tuttavia, xargs conosce la lunghezza della cmdline più lunga e non andrà oltre.

+3

Penso che xargs genererà automaticamente (senza -l) diversi processi se il numero di argomenti è maggiore del massimo di shell. – MatthieuP

+0

Grazie. Non sapevo che xargs potesse farlo. – yhager

13

La versione xargs è drammaticamente più veloce con un sacco di file rispetto alla versione exec come hai postato, questo è perché rm viene eseguito una volta per ogni file che si desidera rimuovere, mentre xargs saranno grumo tutti i file che possibile insieme in un unico comando rm.

Con decine o centinaia di migliaia di file, può essere la differenza tra un minuto o meno rispetto alla parte migliore di un'ora.

È possibile ottenere lo stesso comportamento con -exec terminando il comando con un "+" anziché "\;". Questa opzione è disponibile solo nelle versioni più recenti di find.

Di seguito due sono grosso modo equivalenti:

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

Si noti che la versione xargs sarà ancora eseguito leggermente più veloce (da una piccola percentuale) su un sistema multi-processore, in quanto una parte del lavoro può essere parallelizzato. Questo è particolarmente vero se sono coinvolti molti calcoli.

+1

Ho trovato xargs una strada più veloce da percorrere. Ho attraversato i primi 250.000 file in circa due ore. Poi sono incappato in questo SO e ho provato xargs. Completato il resto dei 750.000 in mezz'ora come un campione! – bbbco

+0

'-exec ...+ 'fa parte dello standard POSIX per' find'; il supporto per esso dovrebbe essere abbastanza diffuso. – chepner