2013-04-09 27 views
1

我有一個包含〜50k文件的目錄。每個文件有〜700000行。我寫了一個awk程序來讀取每一行並只在出現錯誤時纔打印。一切都運行得很好,但所花費的時間是巨大的 - 〜4天!有沒有辦法縮短這個時間?我們可以使用多個核心(進程)嗎?有沒有人嘗試過嗎?使用多線程/內核來提高awk性能

+0

只有在出現錯誤時纔打印?這是否僅僅是在文件中尋找特定的模式?您是否檢查CPU使用情況以驗證您實際上是否受CPU限制? – nneonneo 2013-04-09 04:53:47

+0

是的。僅在出現錯誤時纔打印 - 僅用於減少IO。我沒有檢查CPU使用率。即使它不是CPU密集型的,我們該如何平行運行? – 2013-04-09 04:55:24

+0

這聽起來像是你的I/O綁定,在這種情況下,多個進程可能無濟於事。另外,如果你只是在尋找錯誤,請考慮使用'grep'。 – nneonneo 2013-04-09 04:57:00

回答

1

awkgawk不會自己修復這個問題。沒有魔術「讓它平行」開關。您將需要重寫到一定程度:

  • 碎片的文件 - 解決這個問題是並行運行多個awks',每個文件一個最簡單的方法。你將需要某種調度機制。 Parallelize Bash script with maximum number of processes顯示你可以自己寫在shell中。這將需要更多的閱讀,但是如果你想要更多的功能退房gearmancelery這應該是適用於您的問題
  • 更好的硬件 - 這聽起來像你可能需要一個更快的CPU,使這個走得更快,但它可能也是一個I/O問題。從munin或其他監控系統獲得CPU和I/O圖表有助於確定在這種情況下哪些是瓶頸。您是否嘗試過在基於SSD的系統上運行此項工作?這些日子通常很容易贏。
  • 緩存 - 可能有一些重複的行或文件的數量。如果有足夠的重複,以某種方式緩存處理會很有幫助。如果計算文件的CRC/md5sum並將其存儲在數據庫中,則可以計算新文件的md5sum,如果已經這樣做,則跳過處理。
  • 完全重寫 - 用進行縮放會在某些時候變得荒謬。使用一些map-reduce框架可能是一個好主意。