Проблемы с памятью при сжатии и передаче большого количества небольших файлов (всего 1 ТБ)


15

У меня есть 5 миллионов файлов, которые занимают около 1 ТБ дискового пространства. Мне нужно передать эти файлы третьей стороне.

Какой лучший способ сделать это? Я попытался уменьшить размер, используя .tar.gz, но, несмотря на то, что мой компьютер имеет 8 ГБ ОЗУ, я получаю сообщение об ошибке «Недостаточно системной памяти».

Это лучшее решение для пересылки файлов по почте?


9
У вас есть проблемы СОЗДАНИЕ a .tar.gzили КОПИРОВАНИЕ полученного сжатого файла? В любом случае, что-то странное, потому что ни одна операция не должна занимать больше памяти только потому, что файлы большие. То есть обе операции должны быть потоковыми. Пожалуйста, включите больше информации о том, какие именно команды не выполняются.
Селада,

1
Какую пропускную способность вы и третья сторона сэкономите? Наивный rsync может спасти вас на почтовых расходах. Но я не знаю, как «пять миллионов» файлов будут работать для вас, потому что rsync попытается создать список файлов в памяти и может, если список (5e6 файлов)> 8 ГБ. И конечно это будет медленно.
Калвин Ли

2
@oshirowanen Я не думаю, что он должен занимать кучу памяти, вычисляя список файлов, потому что я уверен, что tarследует просто архивировать файлы постепенно, так как он перечисляет их, а не создавать список в памяти. Но, пожалуйста, покажите точную команду, которую вы используете. Кроме того, все ли файлы находятся в одном каталоге или структура каталога очень глубокая?
Селада

3
Ах, да, программы с графическим интерфейсом часто создаются, не придавая большого значения таким целям, как масштабируемость и надежность. Меня не удивит, если это вина оболочки / интерфейса GUI. Создайте файл с помощью командной строки, и я думаю, вы обнаружите, что он работает просто отлично.
Селада,

3
Передача 1 ТБ данных займет не менее 22 часов при широкополосном соединении со скоростью 100 Мбит / с. Таким образом, в зависимости от того, какую степень сжатия вы ожидаете достичь, обычная почта может оказаться более быстрым вариантом.
Дан

Ответы:


27

Дополнительная информация, предоставленная в комментариях, показывает, что OP использует метод GUI для создания .tar.gzфайла.

Программное обеспечение с графическим интерфейсом часто включает в себя гораздо больше, чем эквивалентное программное обеспечение, аналогичное командной строке, или выполняет дополнительные ненужные задачи ради некоторой «дополнительной» функции, такой как индикатор выполнения. Меня не удивит, если программное обеспечение с графическим интерфейсом пытается собрать список всех имен файлов в памяти. Это не нужно делать, чтобы создать архив. Выделенные инструменты tarи gzipпредназначены для работы с потоковым вводом и выводом, что означает, что они могут работать с вводом и выводом намного больше, чем память.

Если вы избегаете программы с графическим интерфейсом, вы, скорее всего, сможете сгенерировать этот архив, используя совершенно обычный ежедневный tarвызов, подобный следующему:

tar czf foo.tar.gz foo

где fooкаталог, который содержит все ваши 5 миллионов файлов.

Другие ответы на этот вопрос дают вам пару дополнительных альтернативных tarкоманд на случай, если вы захотите разделить результат на несколько частей и т. Д.


15

"пять миллионов" файлов и 1 ТБ в общей сложности? Ваши файлы должны быть очень маленькими. Я бы просто попробовал rsync:

rsync -alPEmivvz /source/dir remote.host.tld:/base/dir

Если у вас этого нет - или ваш вариант использования не позволяет использовать rsync, я бы хотя бы проверил, 7zработает ли с вашими данными. Возможно, нет, но я думаю, что все же стоит попробовать:

7z a archive.7z /source/dir

Или, если вам неудобно 7zхотя бы попытаться сделать .tar.xzархив:

tar cJv archive.tar.xz /source/dir

(Следует отметить, что более старые версии tarне создают .tar.xzархивы, а .tar.lzmaархивы при использовании Jкоммутатора. Даже в более старых версиях флаг tarне поддерживается Jвообще.)


Так как вы используете программу GUI для создания этих файлов, я предполагаю, что вы чувствуете себя немного неловко, используя интерфейс командной строки.

Для облегчения создания, управления и извлечения архивов из интерфейса командной строки есть небольшая утилита под названием atool. Он доступен практически для всех распространенных дистрибутивов, которые я видел, и работает практически со всеми архивами, на которые я наткнулся, за исключением безнадежно неясных.

Проверьте, есть ли в вашем atoolрепозитории дистрибутив , или попросите администратора установить его, когда он находится в рабочей среде.

atool устанавливает несколько символических ссылок на себя, поэтому упаковка и распаковка становится проще:

apack archive.tar.xz <files and/or directories>

Создает архив.

aunpack archive.7z

Расширяет архив.

als archive.rar

Перечисляет содержимое файла.

Какой тип архива создается, atoolразличается по расширению имени вашего архива в командной строке.


4
Преимущество использования rsyncзаключается в том, что, если (когда) соединение разрывается, оно rsyncможет начать с того места, где оно было прервано.
roaima

2
Файлы будут в среднем 200 КБ. Это не так уж и мало.
Нейт Элдридж

4
@NateEldredge Я обычно думаю о большом как о значении> 1 ГБ. Маленький обычно <1MB. Такой маленький.
PythonNut

8

Если вы не можете сделать сжатие лучше, чем 25: 1, вы вряд ли что-то выиграете от сжатия этого перед обычной рассылкой, если у вас нет аппаратного формата ленты, который вы можете обменять с третьей стороной.

Самое большое общее хранилище - это синий луч, и это примерно 40 Гб. Вам понадобится сжатие 25: 1 для ваших данных, чтобы они соответствовали этому. Если у вашей третьей стороны есть только DVD, вам нужно 125: 1 (примерно).

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

Вы просто должны сравнить это с использованием ssh -C(стандартное сжатие) или, предпочтительно, rsyncсо сжатием для копирования файлов по сети, не нужно сжимать и архивировать заранее. 1Tb не является невозможным для перемещения по сети, но это займет некоторое время.


5
+1: «никогда не стоит недооценивать пропускную способность универсала, полного лент, несущихся по шоссе» (Эндрю С. Таненбаум). см. en.wikipedia.org/wiki/Sneakernet
Оливье Дюлак

@OlivierDulac Я видел подобные конструкции с Boeing 747 и коробками, заполненными CDROM, просто удивительно, какую пропускную способность вы можете получить с этим.
Anthon

Мне нравится, что пиджин победил интернет-провайдера, увидев примеры на странице википедии ^^
Оливье Дюлак

6

Вы рассматривали торрент? Peer-to-Peer может быть вашим лучшим вариантом для передачи через Интернет:

  • По крайней мере, так же быстро, как и другие интернет-переводы: скорость загрузки будет определять скорость передачи
  • Нет повреждения данных
  • Выберите файлы для передачи в первую очередь
  • Не требуется дополнительного локального / облачного хранилища
  • Свободно

Вы не сказали, какую ОС вы используете, но поскольку вы говорите о сжатии tar.gz, я предполагаю, что вы используете какую-то GNU / Linux-подобную ОС. Для этого я предлагаю передачу . Это торрент-программа с открытым исходным кодом, работающая на Mac и Linux. Мне это нравится, потому что разработчики прилагают усилия к тому, чтобы сделать его родным для всех клиентов графического интерфейса, которые они поддерживают: нет кроссплатформенного языка.

Вы можете комбинировать этот метод со сжатием, однако вы потеряете способность расставлять приоритеты для частей передачи.


У программного обеспечения Torrent, вероятно, есть те же проблемы, что и у программного обеспечения с графическим интерфейсом. Сохранение имен файлов в памяти и т. Д. Кроме того, торрент-файлы должны хранить метаданные файлов. 5 миллионов имен файлов должны быть упакованы в торрент-файл.
Айеш К

@AyeshK Правда, это повлияет на производительность при добавлении / создании торрента или проверке контрольных сумм. Тем не менее, я считаю, что это самое стабильное решение для передачи большого количества данных.
LaX

По словам торрент-фрика, самый большой из когда-либо распространенных торрентов составляет ~ 800 Гб. Один торрент-файл с большинством файлов содержит около 33K файлов. Но 5 миллионов файлов ... Я не уверен.
Айеш К

3

7z будет моим выбором. Это позволяет автоматически разделять архивы и поддерживает многопоточное сжатие. Нет, xzне смотря на то, что написано в справке. Попробуйте с:

7za a -v100m -m0=lzma2 -mx=9 -ms=on -mmt=$THREADS archive.7z directory/

Выход разделен на блоки по 100 МБ (измените его с помощью -vпереключателя).

Единственным недостатком является то, что 7z не сохраняет метаданные Unix (например, права доступа и владельца). Если вам нужно , что трубы tarвыход в 7zaвместо (см man 7zaдля некоторых примеров).


1
The only real downsideно какой недостаток!
njzk2

@ njzk2 на самом деле это зависит от сценария. Например, если вы отправляете образы резервных копий или дампы базы данных, вы, вероятно, не очень заботитесь о разрешениях.
Стефано Санфилиппо

Я не совсем вижу смысла в использовании 7z для разделения, когда вы можете использовать splitфайл .tar.gz и сохранить метаданные.
njzk2

@ njzk2 тоже раскалывается. Прежде всего, это многопоточное сжатие с LZMA2. Никакая другая утилита Unix, о которой я знаю, ее не поддерживает. 7z также имеет режим не сплошного сжатия, что является большим шагом вперед, когда к tarподходу должен быть доступен только определенный файл .
Стефано Санфилиппо


3

Я щелкнул правой кнопкой мыши по папке, нажал «создать архив» и выбрал опцию .tar.gz. Структура каталогов глубокая, более 500 000 каталогов

Да, удачи вам в этом. И инструмент с графическим интерфейсом попытается сделать это на том же томе, а это означает, что а) вам потребуется еще 1 ТБ свободного места и б) головная боль при чтении одного файла и добавлении его в архив не будет слишком здоровой для накопителя.

Я вижу две возможности:

1) rsync от вашего компьютера к третьему лицу. Один или другой будет нуждаться в глобальном IP-адресе, который меняется не часто. Огромное преимущество Rsync, если вы получаете прерван по какой - либо причине, он может забрать , где она была прервана. Копирование 1 ТБ тарбола будет либо успешным, либо неудачным

2) Приобретите внешний накопитель емкостью 1 ТБ, скопируйте на него данные и получите диск. Высокая задержка, но действительно хорошая пропускная способность, когда она прибывает. Различные онлайн-сервисы резервного копирования для этого для первоначального резервного копирования.



1

Я предлагаю вам использовать что-то вроде:

tar -c -L 104857600 -f file1.tar -f file2.tar -f file3.tar -f file4.tar -f file5.tar -f file6.tar -f file7.tar -f file8.tar -f file9.tar -f file10.tar 
gzip file*.tar

который создаст 10 файлов размером не более 100 ГБ. Но это не решило бы вашу проблему "OOM", так как tar должен передавать поток для чтения / записи, поэтому узким местом является gzip.


0

Как насчет этого:

find /path | tar -T - -czf - | ssh remotehost "cd /target/dir/; tar xzf -"
  • find поиск списков дерева каталогов
  • tar -T - читает список со стандартного ввода
  • -czf -создает архив и пишет в stdout, zgzips поток
  • ssh remotehost войти на удаленный хост используя ssh
  • cd /target/dir/ перейти в целевой каталог
  • tar xzf - извлечь входящий поток из стандартного ввода

Хороший маленький фрагмент. Хотя я думаю, что ему больше всего нужна функция сжатия, поскольку цель состоит в том, чтобы «передать другу»
mveroone

Не полное создание архива повредит, когда соединение прервется, что весьма вероятно при передаче 1 ТБ, либо из-за сбоя в сети (есть провайдеры, которые отключают вас каждые 24 часа), либо по другим причинам.
Йонас Шефер

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.