我有一個大的文本文件〜8GB,我需要做一些簡單的過濾,然後對所有行進行排序。我在一臺配備SSD和128GB RAM的28核機器上。我試圖爲什麼使用pipe進行排序(linux命令)很慢?
方法1
awk '...' myBigFile | sort --parallel = 56 > myBigFile.sorted
方法2
awk '...' myBigFile > myBigFile.tmp
sort --parallel 56 myBigFile.tmp > myBigFile.sorted
令人驚訝地,方法1採用11.5分鐘,而方法2只需要(0.75 + 1 < 2)分鐘。管道排序時爲什麼排序很慢?它不是平行的嗎?
EDIT
awk
和myBigFile
並不重要,這個實驗是重複的通過簡單地使用seq 1 10000000 | sort --parallel 56
(感謝@Sergei Kurenkov),並且我還觀察到使用未管道版本六倍速度的提高我的機器。
嘗試添加-S8G來分配一個8G緩衝區到管道的排序讀數,看看是否有幫助。要一致地測量,你可能希望在每次運行之前(例如myBigFile在第一次讀取之後緩存)[刪除緩存](https://linux-mm.org/Drop_Caches),儘管這並不能解釋這麼大的差別。 –
@JimD。這真的有幫助!現在比編寫中間文件到SSD稍慢(134秒比105秒)(但不應該更快......?) – bbvan
從管道讀取時,排序不知道輸入的時間長短。當從文件中讀取時,它知道它有多大。除此之外,該文件緩存在128GB內存的系統上,因此排序實際上並不是從磁盤讀取,而是從緩存中讀取。所以我認爲這種差異是由於知道投入是巨大的,並且有效地劃分工作的效率,而管道中的排序必須發現輸入是巨大的(即使沒有-S也不會這樣做)。 –