Альтернатива слишком медленному gzip -d команда

Si realmente solo eliminó el shell, debe hacer un informe de error contra bash.

Dado que los shells modernos habilitan automáticamente el control de trabajos para shells interactivos,

./script1&

crea un nuevo trabajo con una identificación de grupo de proceso propia.

El shell espera el programa evincey si llama:

kill -9 $!

solo se eliminará el shell y evincecontinuará ejecutándose.

Sin embargo, si llama:

kill %1

Esto elimina todo el trabajo, incluido evince.

0
02.07.2019, 22:14
2 ответа

Многие дисковые операции ввода-вывода можно заменить конвейерами. func_create_dat_fileберет список из 50 сжатых файлов, читает каждый из них и записывает несжатые данные. Затем он считывает каждый из 50 несжатых файлов данных и записывает их снова с предваряемым именем файла. Вся эта работа выполняется последовательно, поэтому вы не можете использовать преимущества нескольких процессоров.

Я предлагаю вам попробовать

func_create_dat_file()
{
    cd raw_directory
    while IFS="" read -r f
    do
        zcat -- "$f" | sed "s/^/${f%.gz}|/"
    done < "${raw_file_list}" >> "${data_file}"
}

Здесь сжатые данные считываются с диска один раз. Несжатые данные записываются один раз в канал, один раз считываются из канала и затем один раз записываются на диск. Преобразование данных происходит параллельно с чтением и поэтому может использовать 2 процессора.

[Правка] Комментарий с просьбой объяснить часть sed "s/^/${f%.gz}|/". Это код для помещения имени файла в качестве нового поля в начале каждой строки. $f— это имя файла. ${f%.gz}удаляет .gzиз конца строки. В этом контексте нет ничего особенного в |, поэтому ${f%.gz}|— это имя файла с удаленным конечным .gz, за которым следует |. Вseds/old/new/есть замещающая команда (replace ), она принимает regular expressionвместо части old. ^как регулярное выражение соответствует началу строки, поэтому, объединив это, мы скажем, что начало строки должно быть именем файла без завершающих .gzи |. |был добавлен, чтобы соответствовать программе OP, а не описанию OP. Если бы это действительно был файл переменных ), разделенных запятыми, в формате CSV (, то это должна быть запятая, а не вертикальная черта.

5
28.01.2020, 02:15

А как насчет этого улья и халупа? Когда вы даете gzip -d«необработанный список файлов», возможно, это делает нежелательный обход через эту распределенную файловую систему.

Что-то на этом рабочем сервере определенно не работает. Один час на распаковку 20 ГБ (Я опускаю детали ). Я распаковал 100 МБ, разбитых на 11300 файлов, за 0,8 секунды. Это примерно в 20 раз быстрее. Использование наивного вызова gzip с огромным списком файлов и RAM-диска. Я также установил и попробовал параллельно, как было предложено. Это на 10% быстрее :0,7 секунды. Так что проблема не в этом.

(У меня только Mini -PC i5 с 8 ГБ памяти)

У меня работает ваттметр. Во время медленного 14-секундного цикла было использовано 6 Вт.
Во время моего сомнительного цикла -с амперсандом -это было около 17 Вт в течение 6 секунд. (Подсказка, а также X-сервер, составляет 3,5 Вт, приостановка -до -оперативной памяти составляет 1,1, выключение составляет... 0,7 Вт)

14-секундный цикл против 0,8-секундного огромного списка аргументов в моем тесте — это то же соотношение, что и ваши общие 25 ГБ/ч против моих 100 МБ/0,8 с. :TWENTYFOLD... как если бы вы использовали медленный цикл for. Я думаю, что hadoop и hive мешают gzip и bash огромным списком аргументов.

0
28.01.2020, 02:15

Теги

Похожие вопросы