2013-08-08 5 views
0

У меня есть много больших сжатых файлов, называемых xaa.gz, xab.gz, xac.gz и т. Д. К сожалению, они не отсортированы. Я хотел бы сделать эквивалент следующего.Сортировка большого количества сжатых файлов

zcat x*|sort > largefile 

split -l 1000000 largefile 

Затем gzip разделить файлы и выбросить все другие файлы, сделанные ранее.

Проблема заключается в том, что это массивный несжатый файл, а затем много меньших несжатых разделяемых файлов до их сжатия. Можно ли все это сделать без создания огромного файла в середине процесса и, в идеале, без сохранения разделенных файлов до их сжатия?

У меня есть 8 ядер, поэтому я тоже хотел бы воспользоваться ими (у меня нет coreutils 8.20, поэтому нельзя использовать сортировку --parallel).

+0

Вы хотите отсортировать отдельные файлы или объединить все, отсортировать, разделить? – devnull

+0

Комбинат, сортировка, разделение. Это то, что я не могу понять, как эффективно работать. – Anush

+0

Почему вы заинтересованы в том, чтобы файл был разбит на куски? Не доверяете ли вы файловой системе или нет какой-то неустановленной причины? Знаете ли вы, что процессор 'sort' будет доминирующей ценой в этом, или вы преждевременно оптимизируете, потому что можете? – msw

ответ

2

Не полный код, а некоторые идеи о том, что вы можете здесь сделать.

1) ввода разделов файлы обрабатывать их параллельно:

num_cores=8 
i=0 
while read f; do 
    part_name=part$i 
    set $part_name="${!part_name} $f" 
    ((i=(i+1)%num_cores)) 
done < <(ls x*.gz) 

2) распаковывать и сортировать некоторую часть файлов в разных процессах:

sort -m <(zcat $part0 | sort) <(zcat $part1 | sort) ... 

3) сказать раскол немедленно сжать файлы :

... | split -l 1000000 --filter='gzip > $FILE.gz' 
Смежные вопросы