2014-06-19 129 views
1

我需要從200萬行的大型csv文件egrep,我想減少egrep時間到0.5秒,這可能嗎?不,我不想數據庫(sqlite3的或MySQL)在這個時候..什麼是最快的egrep

$ time wc foo.csv 
2000000 22805420 334452932 foo.csv 
real 0m3.396s 
user 0m3.261s 
sys 0m0.115s 

我已經能夠從40秒減少運行時間,以1.75秒

$ time egrep -i "storm|broadway|parkway center|chief financial" foo.csv|wc -l 

108292 

real 0m40.707s 
user 0m40.137s 
sys  0m0.309s 

$ time LC_ALL=C egrep -i "storm|broadway|parkway center|chief financial" foo.csv|wc -l 

108292 

real 0m1.751s 
user 0m1.590s 
sys  0m0.140s 

但我想egrep的實時時間不到半秒鐘,任何技巧將不勝感激,文件不斷變化,所以我不能使用任何緩存機制...

+2

grep的可能的運行速度比磁盤系統快可以吐出數據。如果你想要更快的結果,那就換一個更快的磁盤吧。 –

+0

Marc,unix內核會緩存它,而不是磁盤問題 –

+0

在系統上運行'wc foo.csv'需要多少時間?請添加'時間wc foo.csv'。 –

回答

1

如果您只是搜索關鍵字,您可以使用fgrep(或grep -F)而不是egrep

LC_ALL=C grep -F -i -e storm -e broadway -e "parkway center" -e "chief financial" 

接下來要做的嘗試會分解出-i,這可能是現在的瓶頸。如果你確信只有第一個字母可能是大寫,例如,你可以這樣做:

LC_ALL=C grep -F \ 
    -e{S,s}torm -e{B,b}roadway -e{P,p}"arkway "{C,c}enter -e{C,c}"hief "{F,f}inancial 
+0

rici,太棒了!我在3次嘗試中平均減少1秒,再減少0.5秒! –

+0

@辛蒂:很酷。好吧,還有一個想法,但我不知道它會產生多大的差異。編輯答案。 – rici

+0

rici:-i必須在那裏 –

相關問題