2

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

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

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

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

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

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

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

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

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

1 ответ1

2

Используйте 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, на самом деле может быть быстрее сжать файл при достаточной степени сжатия, поскольку это уменьшит объем записи на диск, что является медленной процесс.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .