web-dev-qa-db-fra.com

Gzip avec tous les cœurs

J'ai un ensemble de serveurs remplis chacun avec un tas de fichiers qui peuvent être compressés. Les serveurs ont tous un nombre différent de cœurs. Comment puis-je écrire un script bash pour lancer un gzip pour chaque noyau et m'assurer que les gzips ne zippent pas le même fichier?

40
User1

Si vous êtes sous Linux, vous pouvez utiliser les xargs de GNU pour lancer autant de processus que vous avez de cœurs.

CORES=$(grep -c '^processor' /proc/cpuinfo)
find /source -type f -print0 | xargs -0 -n 1 -P $CORES gzip -9
  • find -print0/xargs -0 vous protège des espaces blancs dans les noms de fichiers
  • xargs -n 1 signifie un processus gzip par fichier
  • xargs -P spécifie le nombre de travaux
  • gzip -9 signifie une compression maximale
58
Demosthenex

Il existe une implémentation de gzip qui est multithread, pigz . Puisqu'il compresse un fichier sur plusieurs threads, il devrait être en mesure de lire à partir du disque plus efficacement, par rapport à la compression de plusieurs fichiers à la fois.

70
David Yaw

Vous voudrez peut-être envisager de vérifier parallèle GN . J'ai aussi trouvé cette vidéo sur youtube qui semble faire ce que vous cherchez.

6
Gangadhar