Для больших файлов сначала сжимать, а затем передавать или rsync -z? который будет самым быстрым?

14

У меня есть куча небольших файлов данных относительности, но они занимают около 50 ГБ, и мне нужно, чтобы они были перенесены на другую машину. Я пытался придумать наиболее эффективный способ сделать это.

Мысли были о том, чтобы сжать все это, затем rsync и распаковать его, полагаться на rsync -z для сжатия, gzip и затем использовать rsync -z. Я не уверен, что будет наиболее эффективным, так как я не уверен, как именно реализован rsync -z. Есть идеи, какой вариант будет самым быстрым?


источник

Ответы:

11

Вы не можете «сжать все», поскольку gzip сжимает только один файл, вы можете создать tar-файл и скопировать его, чтобы «сжать все», но вы потеряете возможность rsync копировать только измененный файл.

Поэтому вопрос в том, лучше ли хранить файл, который мне нужен, для использования rsync gziped или использовать опцию -z команды rsync.
Ответ, вероятно, заключается в том, что вы не хотите, чтобы файл был разархивирован на вашем сервере? Я думаю, да, поэтому я не понимаю, как вы могли бы сжать файл gzip перед выполнением rsync.

Может быть, вам не нужна возможность rsync копировать только измененный файл? В этом случае зачем использовать rsync вместо scp файла tar.gz, содержащего ваши материалы?

В любом случае, чтобы ответить на вопрос, rsync gzip будет немного менее эффективным, чем файл gziping с gzip. Почему ? поскольку rsync будет разбивать данные по частям gzip, поэтому для создания таблицы, которую gzip использует для сжатия, будет использоваться меньший набор данных, а больший набор данных (gzip будет использовать весь файл сразу) дает лучшую таблицу сжатия. Но в большинстве случаев разница будет очень очень мала, но в очень редком случае разница может быть более важной (если у вас очень большой файл с очень длинным партером, многократно повторяющимся в файле, но далеко друг от друга) (это очень упрощенный пример)

радиус
источник
1
Судя по тому, как я прочитал его вопрос, он сожмет, чтобы получить его по проводу, а затем распакует другую сторону. Я бы использовал нативное сжатие rsync поверх gzip просто потому, что сжатие и распаковка 50 ГБ может занять значительное время. Опять же, если файлы в основном текстовые, они будут хорошо сжиматься. Третий вариант: скопировать файлы на USB-накопитель.
3
@Randolph Potter: да, потерянное время на локальное сжатие 50 ГБ, тогда rsync будет выше, чем при использовании rsync -z, в любом случае, если он захочет воспользоваться преимуществами самого сжатия rsync (копирование только измененного файла), его нельзя сделать раньше
radius
очень хороший момент. +1 для вас :-)
Напомним также, что gzip является компрессором потока.
Сокол Момот
6

Если вы копируете данные только один раз, rsync сам по себе не станет большой победой. Если вам нравится gzip (или tar + gzip, поскольку у вас много файлов), вы можете попробовать что-то вроде:

tar -cz /home/me/source/directory | ssh target tar -xz --directory /home/you/target/directory

Это позволит получить сжатие, которое вы ищете, и просто скопировать напрямую, без использования rsync.

Слартибартфаст
источник
я бы, вероятно, использовал --lzop для этого вместо gzip ... намного быстрее и с меньшими накладными расходами процессора и все еще имеет хорошие коэффициенты сжатия для текста
underrun
5

@radius, второстепенная идея о том, как gzipработает, - gzipэто алгоритм сжатия на основе блоков, причем довольно простой. Весь файл не рассматривается для таблицы сжатия - только каждый блок. Другие алгоритмы могут использовать все содержимое файла, и есть несколько, которые используют содержимое нескольких блоков или даже блоков переменного размера. Один увлекательный пример lrzipтого же автора, что и rsync!

Тощий по gzipроссийскому алгоритму .

Итак, в итоге, использование rsync -z, скорее всего, даст такое же сжатие, как gzipи первое - и если вы делаете дифференциальную передачу, лучше из-за rsyncалгоритма сравнения.

Тем не менее, я думаю, что каждый найдет, что обычные scpудобные удары rsyncдля недифференциальных передач - потому что это будет иметь гораздо меньше накладных расходов, чем rsyncалгоритм (который scpв любом случае будет использовать скрытое!)

Если ваша сеть действительно становится узким местом, то вы хотите использовать компрессию на проводе.

Если ваши диски являются узким местом, то лучше всего потоковую передачу в сжатый файл. (например, netcatс одной машины на другую, потоковая передача в gzip -c)

Обычно, если скорость является ключевым фактором, сжатие существующего файла заранее неэффективно.

TIMTOWTDI, YMMV, IANAL и др.

Hercynium
источник
2

По словам этого парня, это может быть просто быстрее rsync -z, хотя я думаю, это будет почти так же эффективно, как сжатие каждого файла перед передачей. Это должно быть быстрее, чем сжимать поток смолы, как предлагают другие.

Со страницы руководства:

          Note  that  this  option  typically  achieves better compression
          ratios than can be achieved by using a compressing remote  shell
          or  a  compressing  transport  because it takes advantage of the
          implicit information in the matching data blocks  that  are  not
          explicitly sent over the connection.
Insyte
источник
1
Я бы предложил использовать --compress-level = 1 с rsync -z, если у вас быстрая сеть. Вы хотите, чтобы узким местом была сеть, а не процессор или дисковый ввод-вывод, чтобы минимизировать общее время передачи. Если сеть работает медленно, использование -z по умолчанию (что эквивалентно gzip -6, я думаю) может по-прежнему ограничивать сеть процесса.
rmalayter
1

Поскольку и для scp сжатого файла, и для rsync потребуется очень похожее время передачи, «наиболее эффективным способом сделать это» будет сжатие на лету, а не сжатие, передача.

Помимо «быстроты» другие соображения включают в себя:

rsync может быть легко перезапущен, если не все файлы будут переданы.

rsync может использоваться для поддержки файлов на удаленной машине.

локальный tar или gzip требует локального пространства.

Рекомендации по использованию порта для целевой машины и брандмауэров: 1) scp использует порт 22 (по умолчанию), что может быть неприемлемо. 2) порт rsync для пользователей 873 (по умолчанию)

Я не уверен, почему радиус ожидает, что оригинальный постер НЕ хочет, чтобы файлы были разархивированы.

DGerman
источник