Как объединить отсортированные файлы без использования временного файла?
Я пытаюсь объединить много отсортированных файлов в 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