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


15

У мене є 5 мільйонів файлів, які займають близько 1 ТБ місця для зберігання. Мені потрібно передати ці файли третій стороні.

Який найкращий спосіб зробити це? Я намагався зменшити розмір за допомогою .tar.gz, але, хоча мій комп'ютер має 8 Гб оперативної пам’яті, я отримую помилку «поза системною пам’яттю».

Чи є найкращим рішенням по пошті файли для равликів?


9
У вас виникли проблеми СТВОРЕННЯ .tar.gzабо копіювання отриманого стиснутого файла? Так чи інакше, щось дивно, тому що жодна операція не повинна споживати більше пам’яті лише тому, що файли великі. Тобто обидві операції повинні бути потоковими. Будь ласка, включіть додаткову інформацію про те, які саме команди відмовляються.
Селада

1
Скільки пропускної спроможності Ви маєте на увазі та третьої сторони? Наївна rsync може заощадити на поштових перевезеннях. Але я не знаю, як "п’ять мільйонів" файлів працюватимуть для вас, оскільки rsync спробує створити список файлів у пам'яті, а може, якщо список (5e6 файлів)> 8 Гб. І звичайно це буде повільно.
Калвін Лі

2
@oshirowanen Я не думаю, що він повинен зайняти купу пам'яті, обчислюючи список файлів, тому що я впевнений, що tarслід просто архівувати файли поступово, оскільки він перераховує їх, ніколи не створюючи список у пам'яті. Але ще раз, будь ласка, покажіть точну команду, яку ви використовуєте. Також, чи всі файли в одному каталозі чи структура каталогу дуже глибока?
Селада

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

3
1 ТБ даних знадобиться щонайменше 22 години для передачі по 100 Мбіт / с широкосмуговим з'єднанням. Тож залежно від того, якого рівня стиснення ви очікуєте досягти, пошта з равликом насправді може бути швидшим варіантом.
Dan

Відповіді:


27

Додаткова інформація, надана в коментарях, показує, що ОП використовує метод GUI для створення .tar.gzфайлу.

Програмне забезпечення графічного інтерфейсу часто включає набагато більший об'єм, ніж еквівалентне програмне забезпечення еквівалентного командного рядка, або виконує додаткові непотрібні завдання заради якоїсь "додаткової" функції, наприклад панелі прогресу. Мене не здивувало б, якщо програмне забезпечення GUI намагається зібрати список усіх імен файлів у пам'яті. Це зайве для того, щоб створити архів. Спеціальні інструменти tarі gzip, безумовно, розроблені для роботи з потоковим входом і виходом, а це означає, що вони можуть мати справу з входом і виходом набагато більше, ніж пам'ять.

Якщо ви уникаєте програми GUI, ви, швидше за все, можете створити цей архів, використовуючи абсолютно звичайне повсякденне 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 Гб. Малий зазвичай <1МБ. Так досить мало.
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, дивно, яку пропускну здатність ви можете отримати з цим.
Антон

Мені подобається, що піджін давно побив Інтернет-провайдера, дивіться приклади сторінки Вікіпедії ^^
Олів’є Дулак

6

Ви вважали торент? Peer-to-Peer може бути найкращим варіантом для передачі через Інтернет:

  • Принаймні так само швидко, як і інші Інтернет-передачі: швидкість завантаження визначатиме швидкість передачі
  • Без корупції даних
  • Виберіть файли, які потрібно передати спочатку
  • Не потрібно додаткового місцевого / хмарного місця для зберігання
  • Безкоштовно

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

Ви можете комбінувати цей метод із стисненням, проте ви втратите можливість визначати пріоритетність частин передачі.


Програмне забезпечення Torrent, ймовірно, має ті ж проблеми, що й стискання програмного забезпечення GUI. Збереження імен файлів у пам'яті тощо. Також торрент-файли повинні зберігати метадані файлів. 5 мільйонів імен файлів повинні бути упаковані в файл торрента.
Айеш К

@AyeshK Щоправда, це вплине на продуктивність під час додавання / створення торрента або перевірки контрольних сум. Але я вважаю, що це найбільш стабільне рішення для передачі великої кількості даних.
LaX

За даними torrent freak, найбільший торент, який колись ділився, становить ~ 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 каталогів

Так, удачі, щоб отримати це для упаковки. І інструмент GUI спробує зробити це на тому самому томі, що означає: а) вам потрібно ще 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", оскільки дьоготь повинен потікати його читанням / записом, щоб вузьке вузьке місце було gzip.


0

Як про те, що:

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

Гарний маленький фрагмент. Хоча я думаю, що його потреба тут є особливістю стиснення, оскільки мета - "передача другові"
mveroone

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.