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 evince
y si llama:
kill -9 $!
solo se eliminará el shell y evince
continuará ejecutándose.
Sin embargo, si llama:
kill %1
Esto elimina todo el trabajo, incluido evince
.
Многие дисковые операции ввода-вывода можно заменить конвейерами. 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
, за которым следует |
. Вsed
s/old/new/
есть замещающая команда (replace ), она принимает regular expression
вместо части old
. ^
как регулярное выражение соответствует началу строки, поэтому, объединив это, мы скажем, что начало строки должно быть именем файла без завершающих .gz
и |
. |
был добавлен, чтобы соответствовать программе OP, а не описанию OP. Если бы это действительно был файл переменных ), разделенных запятыми, в формате CSV (, то это должна быть запятая, а не вертикальная черта.
А как насчет этого улья и халупа? Когда вы даете 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 огромным списком аргументов.