Gunzip несколько файлов и объединить параллельно?
Можно ли сжать несколько файлов и объединить их в один большой файл, но делать это параллельно на многоядерной машине? Например, сейчас я делаю:
gunzip -c file1.gz > final
gunzip -c file2.gz >> final
gunzip -c file3.gz >> final
gunzip -c file4.gz >> final
Могу ли я сделать то же самое, чтобы обработка разрозненных файлов различными файлами выполнялась в разных процессорах на многоядерном компьютере, и все они были объединены в один и тот же конечный файл?
2 ответа
Это немного короче сделать это с помощью GNU Parallel:
parallel gunzip -c ::: file*.gz > final
но по существу это также пишет во временные файлы.
Посмотрите интровидео, чтобы узнать больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Вы должны использовать временные файлы для этого:
gunzip -c file1.gz > final &
one=$!
gunzip -c file2.gz > final2 &
two=$!
gunzip -c file3.gz > final3 &
three=$!
gunzip -c file4.gz > final4 &
four=$!
wait $one && wait $two && wait $three && wait $four
cat final2 >> final
cat final3 >> final
cat final4 >> final
чтобы распаковать части большего файла в один конечный файл, вам необходимо знать распакованный размер частей. только тогда вы можете создать biiiig пустой файл и записать вывод декомпрессии в нужную позицию в большом файле (с помощью dd
например). так как вы не знаете распакованный размер (без предварительной распаковки деталей), это не сработает.