Мне приходится сжимать несколько очень больших файлов (80 ГБ), и я удивлен (нехваткой) скорости, которую демонстрирует моя система. Я получаю скорость конвертирования около 500 МБ / мин; используя top
, я, кажется, использую один процессор примерно на 100%.
Я почти уверен, что это не (просто) скорость доступа к диску, поскольку создание tar
файла (именно так был создан файл 80G) заняло всего несколько минут (возможно, 5 или 10), но после более чем 2 часов моя простая команда gzip по-прежнему не выполнено.
В итоге:
tar -cvf myStuff.tar myDir/*
Потребовалось <5 минут, чтобы создать 87 G tar-файл
gzip myStuff.tar
Потребовалось два часа и 10 минут, чтобы создать почтовый файл 55G.
Мой вопрос: это нормально? Есть ли определенные варианты, gzip
чтобы ускорить процесс? Будет ли быстрее объединить команды и использовать их tar -cvfz
? Ссылка , которую я видел на pigz
- Параллельная реализация GZip - но , к сожалению , я не могу установить программное обеспечение на компьютере я использую, так что это не вариант для меня. Смотрите, например, этот предыдущий вопрос .
Я собираюсь попробовать некоторые из этих вариантов самостоятельно и рассчитать их время, но вполне вероятно, что я не нажму "волшебную комбинацию" вариантов. Я надеюсь, что кто-то на этом сайте знает правильный прием, чтобы ускорить процесс.
Когда у меня появятся результаты других испытаний, я обновлю этот вопрос - но если у кого-то есть особенно хороший трюк, я был бы очень признателен. Возможно, gzip требует больше времени, чем я думал ...
ОБНОВИТЬ
Как и было обещано, я попробовал трюки, предложенные ниже: измените степень сжатия и измените место назначения файла. Я получил следующие результаты для tar, который был около 4.1GB:
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
Три вещи на заметку:
- Использование,
/usr/bin/time
а неtime
, поскольку встроенная командаbash
имеет гораздо меньше параметров, чем команда GNU - Я не стал использовать эту
--format
опцию, хотя это облегчило бы чтение файла журнала - Я использовал script-in-a-script, так
time
как казалось, что он работает только с первой командой в конвейерной последовательности (поэтому я сделал ее похожей на одну команду ...).
Со всем этим узнал, мои выводы
- Ускорить вещи с
-1
флагом (принятый ответ) - Гораздо больше времени уходит на сжатие данных, чем на чтение с диска
- Вложите капитал в более быстрое программное обеспечение сжатия (
pigz
кажется хорошим выбором). - Если у вас есть несколько файлов для сжатия, вы можете поместить каждую
gzip
команду в свой собственный поток и использовать больше доступного процессора (бедняковpigz
)
Спасибо всем, кто помог мне научиться всему этому!
$> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gz
покажет вам, как быстро ваша машина сжимает материал. side-note2: сохранить результат на другом диске.
man
странице, и я не читал так далеко (потому что она отсортирована по «однобуквенной команде» -#
) , Это научит меня RTFM! Это будет следующая вещь, которую я попробую!
pigz
и запустить его из любого места, где вы его собрали, без его установки. Если компилятора нет, вы можете кросс-компилировать его на другом компьютере, хотя это требует больше усилий, чем может стоить. (Думаю, в зависимости от того, насколько сильно вам нужно это сжатие, чтобы работать быстрее.)