Как объединить отсортированные файлы без использования временного файла? - PullRequest
11 голосов
/ 06 июля 2011

Я пытаюсь объединить много отсортированных файлов в сценарии UNIX / Linux с sort -m, и я заметил, что sort сначала записывает результат во временный файл, а затем копирует его в место назначения. Насколько я понимаю, -m заключался в том, что он предполагает, что файлы отсортированы, поэтому использование временного файла совершенно не нужно, и он тратит и пространство на жестком диске, и циклы ЦП (я использую 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.

Ответы [ 2 ]

5 голосов
/ 06 июля 2011

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

--batch-size=NMERGE  

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

--compress-program=PROG 

сжатие временных файлов с помощью PROG; распакуйте их с помощью PROG -d

1 голос
/ 25 июня 2014

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

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

Я запустил эту команду:

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

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

$ 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
...