2011-07-06 39 views
10

我試圖在sort -m的UNIX/Linux腳本中合併很多已排序的文件,並且我注意到sort首先將結果寫入臨時文件,然後將其複製到目標。我對-m的理解是,它假定文件是排序的,所以使用臨時文件是完全不必要的,並且浪費了硬盤空間和CPU週期(我在使用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。

+0

我想是因爲'sort'被寫了一個通用的工具,他們並沒有考慮你的情況下,一些更復雜添加到程序等依靠TMP的性病排序機制文件。 ....編寫一個awk腳本可以非常容易,它循環輸入文件列表,比較每條第一行,打印一個文件中的「最低」值,從該文件獲取下一條記錄,然後比較所有再次記錄,希望打印下一個'最低'的記錄。您可能會遇到系統對打開文件的限制,但對於您編寫的任何解決方案而言,情況都是如此。首先測試4。祝你好運 – shellter

回答

3

看看這些選項man sort,他們可能會讓你儘可能減少合併所需的空間。

--batch-size=NMERGE 

一次合併最多NMERGE輸入;用於更多使用臨時文件

--compress-program=PROG 

用PROG壓縮臨時對象;使用PROG進行解壓縮-d

+0

這不是問題的解決方案,因爲它被問及如何防止臨時文件,以及爲什麼需要臨時文件? 您的答案有助於減少臨時文件,但不會阻止它們。對於大文件,它仍然使用臨時文件 – user890739

+1

它確實解決了這個問題。您必須將'--batch-size'設置爲高於要合併的文件數。我有31個文件要合併,沒有指定它使用臨時文件開始的選項。當設置'--batch-size = 31'時,它開始立即寫入輸出,沒有臨時文件。 – fatlasercat

0

使用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 
相關問題