2009-06-11 7 views
6

Dans mon application web, je rends les pages en utilisant un script PHP, puis je génère des fichiers HTML statiques à partir de celles-ci. Les HTML statiques sont servis aux utilisateurs pour accélérer les performances. Les fichiers HTML deviennent éventuellement périmés et doivent être supprimés.Qui est plus rapide, 'find -exec' ou 'find | xargs -0 '?

Je discute entre deux façons d'écrire le script d'expulsion.

La première utilise une seule commande find, comme

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

La deuxième forme est par la tuyauterie à travers xargs, quelque chose comme

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

La première forme invoque rm pour chaque fichier qu'il trouve, tandis que la seconde forme envoie simplement tous les noms de fichier à un seul rm (mais la liste des fichiers peut être très longue).

Quelle forme serait la plus rapide? Dans mon cas, le répertoire de cache est partagé entre quelques serveurs Web, donc tout est fait par NFS, si cela est important pour ce problème.

Répondre

6

Je m'attends à ce que la version de xargs soit légèrement plus rapide car vous ne générez pas de processus pour chaque nom de fichier. Mais, je serais surpris s'il y avait réellement beaucoup de différence dans la pratique. Si vous vous inquiétez de la longue liste que xargs envoie à chaque invocation de rm, vous pouvez utiliser -l avec xargs pour limiter le nombre de jetons qu'il utilisera. Cependant, xargs connaît la plus longue longueur de cmdline et ne va pas au-delà.

+3

Je pense que xargs générera automatiquement (sans -l) plusieurs processus si le nombre d'arguments est supérieur au maximum du shell. – MatthieuP

+0

Merci. Je ne savais pas que xargs pouvait le faire. – yhager

13

La version xargs est nettement plus rapide avec un grand nombre de fichiers que la version -exec que vous posté, c'est parce que rm est exécuté une fois pour chaque fichier que vous souhaitez supprimer, alors que xargs amalgamer autant de fichiers que possible ensemble en une seule commande rm.

Avec des dizaines ou des centaines de milliers de fichiers, il peut faire la différence entre une minute ou moins par rapport à la meilleure partie d'une heure.

Vous pouvez obtenir le même comportement avec -exec en terminant la commande avec un "+" au lieu de "\;". Cette option est uniquement disponible dans les nouvelles versions de find.

Les deux suivants sont à peu près équivalentes:

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

Notez que la sur un système multi-processeur Version xargs continue à fonctionner un peu plus vite (quelques pour cent), parce que certains travaux peuvent être parallélisés. Ceci est particulièrement vrai si beaucoup de calculs sont impliqués.

+1

J'ai trouvé xargs plus rapide. J'ai parcouru les 250 000 premiers fichiers en près de deux heures. Puis je suis tombé sur ce SO et essayé xargs. Complété le reste des 750 000 en une demi-heure comme un champion! – bbbco

+0

'-exec ...+ 'fait partie de la norme POSIX pour' find'; le soutien devrait être assez répandu. – chepner