Как объединить отсортированные файлы без использования временного файла?

Я пытаюсь объединить много отсортированных файлов в UNIX/Linux script с sort -m, и я заметил, что sort сначала записывает результат во временный файл, а затем копирует его в пункт назначения. Мое понимание -m заключалось в том, что он предполагает, что файлы отсортированы, поэтому использование временного файла совершенно не нужно, и оно отнимает пространство на жестком диске и циклы процессора (я использую sort в конвейере, который застревает в ожидании sort для вывода чего-либо.) Есть ли способ сказать sort не использовать временные файлы при слиянии отсортированных файлов? Или лучше, чем нет?

Точный CL выглядит следующим образом:

$ sort -m -s -t '_' -k 1,1n -k 2,2n <(gunzip <file_1) [...] <(gunzip <file_n) | gzip >output

Я использую sort из GNU coreutils 5.97.

Ответ 1

Проверьте эти параметры из man sort, они могут позволить вам свести к минимуму объем пространства, необходимого для слияния.

--batch-size=NMERGE  

сливается не более чем входы NMERGE одновременно; для более эффективного использования временных файлов

--compress-program=PROG 

сжатие временных рядов с помощью PROG; распаковать их с помощью PROG -d

Ответ 2

Работа с GNU coreutils 6.10, я не вижу этой проблемы.

Одна из команд командной строки, которую вы используете, заключается в том, что перенаправление < (...) записывает вход во временный файл перед началом команды. Может быть, это задержка, которую вы видите?

Я выполнил эту команду:

sort -m a b c d e f g h i j | more

и он не создал временный файл для вывода. Я подал вывод на большее, чтобы он блокировал, а затем просмотрел /proc, чтобы посмотреть, что делает. У него были все входные файлы открытыми, а труба - на большую команду, но это было все. Нет временного файла:

$ ls -l /proc/1308/fd
total 0
lrwx------ 1 brianb brianb 64 2014-06-24 18:50 0 -> /dev/pts/0
l-wx------ 1 brianb brianb 64 2014-06-24 18:50 1 -> pipe:[217016034]
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 10 -> /home/brianb/h
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 11 -> /home/brianb/i
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 12 -> /home/brianb/j
lrwx------ 1 brianb brianb 64 2014-06-24 18:50 2 -> /dev/pts/0
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 3 -> /home/brianb/a
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 4 -> /home/brianb/b
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 5 -> /home/brianb/c
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 6 -> /home/brianb/d
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 7 -> /home/brianb/e
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 8 -> /home/brianb/f
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 9 -> /home/brianb/g