shell - multiple - xargs aix



Ce qui est plus rapide, 'find-exec' ou 'find | xargs-0 '? (2)

Dans mon application web, je rends les pages en utilisant un script PHP, puis je génère des fichiers HTML statiques à partir d'elles. 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.

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

Le premier utilise une commande find unique, comme

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

La deuxième forme est en passant par xargs, quelque chose comme

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

Le premier formulaire invoque rm pour chaque fichier trouvé, tandis que le second formulaire envoie simplement tous les noms de fichiers à un seul fichier (mais la liste des fichiers peut être très longue).

Quelle forme serait la plus rapide?

Dans mon cas, le répertoire cache est partagé entre quelques serveurs Web, donc tout est fait sur NFS, si cela est important pour ce problème.

https://ffff65535.com


La version de xargs est beaucoup plus rapide avec beaucoup de fichiers que la version -exec que vous avez publiée, car rm est exécutée une fois pour chaque fichier que vous voulez supprimer, tandis que xargs regroupe autant de fichiers que possible dans un même fichier. commander.

Avec des dizaines ou des centaines de milliers de fichiers, cela 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 versions les plus récentes de find .

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

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

Notez que la version xargs fonctionnera encore un peu plus vite (de quelques pourcents) sur un système multiprocesseur, car une partie du travail peut être parallélisée. Ceci est particulièrement vrai si beaucoup de calculs sont impliqués.


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à.





xargs