2014-09-02 51 views
0

我有一個10 TB的文件從多本書中的單詞,我試圖grep一些不尋常的字符串(沒有正則表達式)。例如:我希望grep能夠接受10 TB的文件多久?

grep "cappucino" filename

我想估計這將需要多長時間。我並不是真的在尋找是否正確的方法。我希望更多地瞭解當我調用grep時真正發生的事情。

請糾正我,如果我錯了:

我使用的機械硬盤與200 MB/s的讀取速度,因此將需要約10萬個/ 200 =50000秒= 14小時才能完成。這是一個準確的估計?

+0

在哪裏,進行計算的時間(單詞進行比較等?) – bksi 2014-09-02 02:10:06

+2

我認爲你也應該考慮CPU中的數據處理時間。 – 2014-09-02 02:10:15

+0

這是一個正則表達式搜索還是不是? – 2014-09-02 02:19:22

回答

2

簡短的回答是:不。

較長的答案是:它取決於。

的甚至更長的答案是:grep的性能取決於很多事情:

  • 你運行一個固定字符串搜索(-F,fgrep一樣)或不 - 這本身grep所使用博耶 - 穆爾算法無法找到正則表達式,所以grep做了什麼(或者至少是用來做)是它首先在你的正則表達式中找到一個固定的字符串,試圖在文本中使用BM找到它,並進行正則表達式匹配(不確定當前的實現是否使用了NFA或DFA的實現,可能是一個混合型)
  • 多久是你的模式 - BM工作更長的模式
  • 多少比賽會讓你有 - 比賽越少,速度就越快是
  • 什麼是你的CPU和內存 - 僅在在計算時間看的不是
  • 什麼其他選擇,你用硬盤驅動器將幫助您grep的
  • 14小時甚至可能不是你的下界,因爲博耶 - 摩爾是足夠聰明,在計算其未來可能的匹配可能發生,因此並不需要讀入整個文件的偏移量。這確實取決於實施,但只是我的猜測。重新運行以下測試用更長的模式後,我才得以下井0.23sec,我不認爲我的磁盤是快。 但是可能會涉及一些緩存。

比如我在一個500MB/s的SSD運行(至少這是製造商說什麼)和grepping一個200MB的文件,在很短的模式(幾個字符)給我:

隨着808320

real 0m1.734s 
user 0m1.334s 
sys 0m0.120s 

隨着0點擊:

real 0m0.059s 
user 0m0.046s 
sys 0m0.016s 

@Edit:在短閱讀Boyer-Moore :-)

@ EDIT2:好檢查的grep是如何工作的,你應該檢查而不是源代碼,我上面描述的非常一般的工作流程。

相關問題