2014-01-23 99 views
4

我想寫一個簡單的函數,讀取一系列文件,並對它們執行一些正則表達式搜索(或只是一個字數),然後返回匹配的數量,我試圖並行運行以加速它,但到目前爲止,我一直無法實現這一點。茱莉亞並行文本處理

如果我用數學運算做一個簡單的循環,我會得到顯着的性能提升。然而,對於grep的功能有類似的想法不提供速度增加:

function open_count(file) 
    fh = open(file) 
    text = readall(fh) 
    length(split(text)) 
end 



tic() 
total = 0 
for name in files 
    total += open_count(string(dir,"/",name)) 
    total 
end 
toc() 
elapsed time: 29.474181026 seconds 


tic() 
total = 0 
total = @parallel (+) for name in files 
    open_count(string(dir,"/",name)) 
end 
toc() 

elapsed time: 29.086511895 seconds 

我嘗試了不同的版本,但還沒有得到顯著的速度增加。難道我做錯了什麼?

+0

27秒處理文件?我猜這些是相當大的磁盤文件,它們不適合你的處理器的磁盤緩存,每次都必須從磁盤讀取。然後,您希望的最好時間等於從磁盤讀取這兩個文件的時間。通常,磁盤一次只能讀取一個地方 - >磁盤讀取是連續的,因此不會加速。 –

+0

這不是一個單一的文件,它是一個文件列表(總共幾乎是我認爲的GB)。我應該這樣說。但是,謝謝你的解釋。 –

+0

我無法測試這個,因爲我沒有這個尺寸的文件來測試。你能發佈一個腳本來生成具有相同結構和大小的東西嗎?你的操作系統可能在這裏佔用大部分時間。你有考慮關閉open_count()中的文件嗎? – ivarne

回答

1

我有類似的問題與R和Python。正如其他人在評論中指出的,你應該從分析器開始。

如果閱讀佔用了大部分時間,那麼你可以做的事情就不多了。您可以嘗試將文件移動到不同的硬盤驅動器並從那裏讀取它們。 您也可以嘗試一種RAMDisk類型的解決方案,它基本上使您的RAM看起來像永久存儲(減少可用的RAM),但是可以實現非常快速的讀取和寫入。

但是,如果時間用於執行正則表達式,請考慮以下內容: 創建一個函數,該函數將整個文件讀入並拆分出單獨的行。這應該是一個連續的閱讀,因此儘可能快。然後創建一個並行版本的regex,並行處理每一行。這樣整個文件就在內存中,您的計算內核可以更快速地處理數據。這樣你可能會看到性能有所提高。

這是我在嘗試處理大型文本文件時使用的技巧。