Gzip со всеми ядрами

У меня есть набор серверов, каждый из которых заполнен кучей файлов, которые можно распаковать. Все серверы имеют разное количество ядер. Как я могу написать bash-скрипт для запуска gzip для каждого ядра и убедиться, что gzips не упаковывают один и тот же файл?

3 ответа

Решение

Если вы работаете в Linux, вы можете использовать GNU xargs для запуска столько процессов, сколько у вас есть ядер.

CORES=$(grep -c '^processor' /proc/cpuinfo)
find /source -type f -print0 | xargs -0 -n 1 -P $CORES gzip -9
  • find -print0 / xargs -0 защищает вас от пробелов в именах файлов
  • xargs -n 1 означает один процесс gzip на файл
  • xargs -P указывает количество заданий
  • gzip -9 означает максимальное сжатие

Существует реализация многопоточного gzip, pigz. Поскольку он сжимает один файл в нескольких потоках, он должен иметь возможность читать с диска более эффективно, чем сжатие нескольких файлов одновременно.

Вы можете рассмотреть возможность проверки GNU параллельно. Я также нашел это видео на YouTube, которое, кажется, делает то, что вы ищете.

Другие вопросы по тегам