Unix

使用臨時文件與管道的優缺點

  • March 30, 2015

假設我有一個名為 jobs.csv 的文件,我希望 Foo 完成前 5 萬個工作

我可以這樣做:

# cat jobs.csv | sort -u | head -n 50000 > /tmp/jobs.csv
# cat /tmp/jobs.csv | while read line; do Foo --job=$line; done

或者

# cat jobs.csv | sort -u | head -n 50000 | while read line; do Foo --job=$line; done 

就係統的 IO/Memory 效率而言,誰能說出哪一個更好?

或者更好的是,有人可以為此提出更好的解決方案嗎?

我通常會選擇第二個選項(一直是管道),除非其中一個中間輸出對我的另一項任務有用。例如,如果在對 50k 個作業執行 Foo 之後,您想對相同的作業執行 Bar,那麼它會很有/tmp/jobs.csv用。

一直使用管道使系統能夠儘早忘記數據,因此它可以更有效地使用記憶體。它還繞過了 VFS 和 tmpfs 堆棧,因此它使用的 CPU 略少。鏈的整體性能也更快,因為您無需等待一個步驟完成即可開始下一步(除非特定程序需要它)。

順便說一句,在您的範例中,最大的記憶體使用者將是sort舞台,因為它需要將 的全部內容保留jobs.csv在記憶體中以便對其進行排序。您可以通過改進jobs.csv最初創建的任何內容來提高效率,這樣您就不再需要sort -u.

引用自:https://serverfault.com/questions/277100