Час копіювання дуже великих (100 Г) файлів


27

Мені здається, що мені потрібно стиснути декілька дуже великих файлів (80 ГБ ГБ), і я здивований (відсутність) швидкості, яку демонструє моя система. Я отримую близько 500 МБ / хв швидкість перетворення; використовуючи top, я, здається, використовую єдиний процесор приблизно на 100%.

Я впевнений, що це не (просто) швидкість доступу до диска, оскільки створення tarфайлу (саме так створено файл 80G) зайняло всього кілька хвилин (можливо, 5 чи 10), але через 2 години моя проста команда gzip все ще не зроблено.

Підсумовуючи:

tar -cvf myStuff.tar myDir/*

Знадобиться <5 хвилин, щоб створити файл з гудроном 87 G

gzip myStuff.tar

Потрібно дві години та 10 хвилин, створивши поштовий файл 55G.

Моє запитання: Це нормально? Чи є певні варіанти gzipприскорити роботу? Чи було б швидше об'єднати команди та використовувати tar -cvfz? Я бачив посилання на pigz- Паралельне впровадження GZip - але, на жаль, я не можу встановити програмне забезпечення на машині, яку я використовую, тому це не є для мене варіантом. Дивіться, наприклад, це попереднє запитання .

Я маю намір спробувати деякі з цих варіантів самостійно та обробити їх, але цілком ймовірно, що я не потрапляю на "магічну комбінацію" варіантів. Я сподіваюся, що хтось на цьому веб-сайті знає правильний трюк, щоб прискорити справи.

Коли у мене будуть результати інших випробувань, я оновлю це питання, але якщо у когось є особливо хороший трюк, я б дуже вдячний за це. Можливо, gzip просто займає більше часу на обробку, ніж я зрозумів ...

ОНОВЛЕННЯ

Як було обіцяно, я спробував наведені нижче прийоми: змінити кількість стиснення та змінити призначення файлу. Я отримав такі результати для дьогтю, який був близько 4,1 Гб:

flag    user      system   size    sameDisk
-1     189.77s    13.64s  2.786G     +7.2s 
-2     197.20s    12.88s  2.776G     +3.4s
-3     207.03s    10.49s  2.739G     +1.2s
-4     223.28s    13.73s  2.735G     +0.9s
-5     237.79s     9.28s  2.704G     -0.4s
-6     271.69s    14.56s  2.700G     +1.4s
-7     307.70s    10.97s  2.699G     +0.9s
-8     528.66s    10.51s  2.698G     -6.3s
-9     722.61s    12.24s  2.698G     -4.0s

Так що так, зміна прапора з типового -6на найшвидший -1дає мені 30% швидкість, з (за моїми даними) навряд чи будь-якими змінами розміру zip-файлу. Незалежно від того, я використовую той самий диск або інший, це істотно не має різниці (мені доведеться запустити це кілька разів, щоб отримати будь-яку статистичну значимість).

Якщо когось цікавить, я створив ці орієнтири часу, використовуючи наступні два сценарії:

#!/bin/bash
# compare compression speeds with different options
sameDisk='./'
otherDisk='/tmp/'
sourceDir='/dirToCompress'
logFile='./timerOutput'
rm $logFile

for i in {1..9}
  do  /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $sameDisk $logFile
  do  /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $otherDisk $logFile
done

І другий сценарій ( compressWith):

#!/bin/bash
# use: compressWith sourceDir compressionFlag destinationDisk logFile
echo "compressing $1 to $3 with setting $2" >> $4
tar -c $1 | gzip -$2 > $3test-$2.tar.gz

Три речі, які слід зазначити:

  1. Використання, /usr/bin/timeа не time, оскільки вбудована команда bashмає набагато менше можливостей, ніж команда GNU
  2. Я не переймався використанням --formatопції, хоча це полегшило б читати файл журналу
  3. Я використовував сценарій в сценарії, оскільки, timeздавалося, працював лише над першою командою в трубопровідній послідовності (тому я зробив це схожим на одну команду ...).

З усього цього вивченого, мої висновки є

  1. Пришвидшіть роботу з -1прапором (прийнята відповідь)
  2. Значно більше часу витрачається на стиснення даних, ніж на читання з диска
  3. Інвестуйте у швидше програмне забезпечення стиснення ( pigzздається, хороший вибір).
  4. Якщо у вас є кілька файлів для стиснення, ви можете скласти кожну gzipкоманду в свою власну нитку і використовувати більше доступних процесорів (убогих pigz)

Дякую всім, хто допоміг мені навчитися всьому цьому!


tar -cvf не робить компресії, тому буде швидше
parkydr

2
@Floris: які дані ви намагаєтесь стиснути? сторона-примітка: $> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gzпокаже вам, як швидко ваша машина стискає матеріал. side-note2: збережіть результат на інший диск.
акіра

3
Вибачте, я неправильно прочитав ваше запитання. gzip має опцію --fast для вибору найшвидшого стиснення
parkydr

1
@parkydr: Варіант --fast - це той, про який я не знав ... це останній на manсторінці, і я не читав цього далеко (тому що це відсортовано за "командою однієї літери", яка є -#) . Це навчить мене RTFM! Це буде наступне, що я спробую!
Флоріс

2
Зауважте, що якщо на машині доступний відповідний компілятор, а дозволи файлової системи не встановлені, щоб забороняти виконувати бінарні файли з каталогів, до яких ви маєте доступ, ви можете компілювати pigzта запускати його звідки завгодно, щоб створити його, не встановлюючи його. Якщо компілятора немає, ви можете перехресно його компілювати на іншому комп'ютері, хоча це починає докладати більше зусиль, ніж це може коштувати. (Я думаю, залежно від того, наскільки сильно вам потрібна ця компресія для швидшого запуску, я думаю.)
David Z

Відповіді:


27

Ви можете змінити швидкість gzip, використовуючи --fast --bestабо -#де # - це число між 1 і 9 (1 - це найшвидше, але менше стискання, 9 - найбільш повільне, але більше стиснення). За замовчуванням gzip працює на рівні 6.


26

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

Проблема полягає в тому, що gzip обмежений (як ви виявили) одним потоком.

Введіть pigz , який може використовувати кілька ниток для виконання стиснення. Прикладом того, як це використовувати:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip

На сестринському сайті є хороший короткий підсумок варіанту --use -press-program .


Дякуємо за вашу відповідь та посилання. Я фактично згадував порося в питанні.
Флоріс

Тут правильна відповідь ..!
stolsvik

4

Здається, я використовую один процесор приблизно на 100%.

Це означає, що не існує проблеми з продуктивністю вводу-виводу, але для стиснення використовується лише один потік (що стосується gzip).

Якщо вам вдасться досягти доступу / угоди, необхідної для встановлення інших інструментів, то 7zip також підтримує декілька потоків, щоб скористатися багатоядерними процесорами, хоча я не впевнений, чи поширюється це на формат gzip, а також його власний.

Якщо ви до цього часу дотримуєтесь лише використання gzip та маєте кілька файлів для стиснення, ви можете спробувати їх стиснути окремо - таким чином ви будете використовувати більше цього багатоядерного процесора, запускаючи більше одного процесу паралельно. Будьте обережні, не перестарайтеся, оскільки, як тільки ви дістанетесь десь поблизу потужності, ваша продуктивність підсистеми вводу / виводу скоротиться швидко (до нижчої, ніж якщо ви використовували один процес / нитку), оскільки затримка рухів голови стає значною вузьке місце.


дякую за ваш внесок Ви давали мені ідею (за яку ви отримуєте підсумок): оскільки у мене є кілька архівів для створення, я можу просто записати окремі команди, за якими слідує a &- тоді нехай система піклується про це звідти. Кожен буде працювати на своєму власному процесорі, і оскільки я витрачаю набагато більше часу на стиснення, ніж на введення / виведення, знадобиться той самий час, щоб зробити один, як зробити всі 10 з них. Тож я отримую "багатоядерну продуктивність" від виконуваного файлу, який є однопоточним ...
Флоріс

1

Можна також використовувати кількість доступних процесів, а також у pigz, яка, як правило, швидша продуктивність, як показано в наступній команді

tar cf - каталог для архіву | pigz -0 -p largenumber> mydir.tar.gz

Приклад - tar cf - patha | pigz -0 -p 32> patha.tar.gz

Це, мабуть, швидше, ніж методи, запропоновані у публікації, оскільки -p - це кількість процесів, які можна запустити. В моєму особистому досвіді налаштування дуже великого значення не шкодить продуктивності, якщо каталог, який потрібно архівувати, складається з великої кількості невеликих файлів. Інше значення, що вважається за замовчуванням - 8. Для великих файлів моєю рекомендацією було б встановити це значення як загальну кількість потоків, що підтримуються в системі.

Приклад встановлення значення p = 32 у випадку 32-х процесорних машин допомагає.

0 призначений для найшвидшого стиснення pigz, оскільки він не стискає архів і, скоріше, фокусується на швидкості. Значення за замовчуванням - 6 для стиснення.

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