Самый быстрый способ сжать (т.е. заархивировать в один файл) миллионы маленьких файлов в мощном кластере, чтобы ускорить передачу файлов

507
vivoru

ВАЖНОЕ ПРИМЕЧАНИЕ: сжатие НЕ является целью, архивация / запись на пленку (упаковка всех файлов в один архив) является целью.

Я хочу сделать резервную копию одного каталога, который содержит сотни подкаталогов и миллионы небольших файлов (<800 КБ). При использовании rsyncдля копирования этих файлов с одного компьютера на другой удаленный компьютер, я заметил, что скорость передачи очень низкая, всего около 1 МБ / с, тогда как при копировании огромных файлов (например, 500 ГБ) скорость передачи факт около 120 МБ / сек. Таким образом, сетевое соединение не является проблемой вообще.

В таком случае перемещение только 200 ГБ таких маленьких файлов заняло у меня около 40 часов. Поэтому я собираюсь сжать весь каталог, содержащий эти файлы, а затем перенести сжатый архив на удаленный компьютер, а затем распаковать его на удаленном компьютере. Я не ожидаю, что этот подход сократит 40 часов до 5 часов, но я подозреваю, что это определенно займет менее 40 часов.

У меня есть доступ к кластеру с 14 ядрами процессора (56 потоков - процессор Intel® Xeon® Gold 5120 @ 2,20 ГГц) и 128 ГБ оперативной памяти. Поэтому питание ЦП / ОЗУ не является проблемой.

Но какой самый быстрый и эффективный способ создать один архив из такого количества файлов? В настоящее время я знаю только об этих подходах:

  • традиционный tar.gzподход
  • 7zip
  • pigz(параллельный gzip - https://zlib.net/pigz/ )

Тем не менее, я не знаю, что быстрее и как параметры должны быть настроены для достижения максимальной скорости? (например, лучше ли использовать все ядра процессора с 7zip или только одно?)

NB Размер файла и степень сжатия НЕ имеют значения вообще. Я не пытаюсь сэкономить место на всех. Я только пытаюсь создать один архив из такого количества файлов, чтобы скорость передачи составляла 120 МБ / с вместо 1 МБ / с.

СВЯЗАННЫЙ : Как сделать 7-Zip быстрее

2
Первый возможный подход, который приходит мне в голову, - это сначала `gzip`, а затем` tar`: с помощью сжатия нескольких файлов по отдельности вы можете сжимать несколько файлов одновременно (до 1 на каждый поток ЦП). Это поделит время сжатия на * до * 56 в вашем случае. Вы можете использовать любой другой метод сжатия, кроме gzip. Nathan.Eilisha Shiraini 6 лет назад 0
Сжатие, вероятно, не имеет большого значения. Кроме того, поскольку файлы небольшие, выигрыш от их индивидуального сжатия, вероятно, будет небольшим. Выполнение в обратном порядке, вероятно, даст лучший результат, если имеет значение общий размер файла. Seth 6 лет назад 0
Если вы просто хотите, чтобы связь была полностью насыщенной, имеет ли значение сжатие? Разве не "tar" сделал бы работу? Mokubai 6 лет назад 0

1 ответ на вопрос

2
davidgo

Используйте tar, но воздержитесь от gzipping части. Весь смысл TAR состоит в том, чтобы преобразовать файлы в один поток (это означает, что архив на ленте). В зависимости от вашего процесса вы можете записать поток на диск и скопировать его, но, более эффективно, вы можете передать его (например, через SSH) на другую машину - возможно, распаковав его одновременно.

Поскольку процесс является скорее вводом-выводом, а не интенсивным использованием ЦП, процесс пареллизации процесса не сильно поможет, если вообще поможет. Вы уменьшите размер передаваемого файла (если файлы не совсем делятся на размер блока), и вы сэкономите много, не имея при этом назад и вперед для согласования каждого файла.

Чтобы создать несжатый файл tar:

tar -cf file.name /path/to/files 

Для потоковой передачи по сети:

tar -c /path/to/files | ssh user@dest.domain 'cd /dest/dir && tar -x' 

Примечание. Если записать промежуточный файл на жесткий диск в соответствии с примером 1, на самом деле может быть быстрее сжать файл при достаточной степени сжатия, поскольку это уменьшит объем записи на диск, что является медленной процесс.

Поскольку почти все мои файлы являются `.bmp`, сжатие, несомненно, значительно уменьшит размер файла (особенно если я использую что-то вроде` 7z -mx9`, я уверен, что конечный архив будет иметь степень сжатия не менее 60%). Но мне совершенно безразлична скорость сжатия, для меня крайне важна скорость передачи и получения файлов на удаленной машине в кратчайшие сроки. Не является ли `7zip` (.7z) более эффективным, чем` tar` даже для записи? vivoru 6 лет назад 0
Я много отлаживал второй пример. Пожалуйста, просмотрите, если это то, что вы имели в виду. Kamil Maciorowski 6 лет назад 0

Похожие вопросы