2013-04-20 75 views
2

全部, 我很新,正在尋求幫助。我需要對壓縮大約20 GB數據的數據集執行字符串搜索。我有一個8核心的Ubuntu 32GB的內存盒,我可以用它來解決這個問題,但我無法實現或確定這樣的任務的最佳代碼。線程或多處理對於這樣的任務是否最好?請提供代碼示例。謝謝。 請看我目前的代碼;Python for循環使用線程或多處理

#!/usr/bin/python 
import sys 
logs = [] 
iplist = [] 

logs = open(sys.argv[1], 'r').readlines() 
iplist = open(sys.argv[2], 'r').readlines() 
print "+Loaded {0} entries for {1}".format(len(logs), sys.argv[1]) 
print "+Loaded {0} entries for {1}".format(len(iplist), sys.argv[2]) 

for a in logs: 
    for b in iplist: 
     if a.lower().strip() in b.lower().strip() 
      print "Match! --> {0}".format(a.lower().strip()) 
+2

我不確定Python是你的任務的工具。你爲什麼不只是在sqlite中加載這些呢? – 2013-04-20 03:04:05

+0

我很抱歉,請你解釋一下你的推理嗎?我真的認爲這將是一個很好的Python用例。 – noobie 2013-04-20 03:49:55

+0

那麼,這在SQL中很容易實現,但在Python中肯定可行。只有兩個巨大的文件,或許多較小的文件? – reptilicus 2013-04-20 04:03:02

回答

1

我不知道,如果多線程可以幫助你,但你的代碼有一個問題,那就是壞的表現爲:讀取日誌一氣呵成消耗了難以置信的大量的內存和捶打緩存。相反,打開它並順序讀取它,畢竟你正在進行順序掃描,不是嗎?然後,不要對相同的數據重複任何操作。尤其是,iplist不會更改,但對於每個日誌條目,您都重複呼叫b.lower().strip()。在使用IP地址閱讀文件後,一次這樣做。

總之,這看起來是這樣的:

with open(..) as f: 
    iplist = [l.lower().strip() for l in f] 

with open(..) as f: 
    for l in f: 
     l = l.lower().strip() 
     if l in iplist: 
      print('match!') 

可以提高性能,甚至通過使用IPLIST設置的更多,因爲看東西會有時,有許多因素要快。也就是說,我假設第二個文件很大,而iplist將保持相對較小。

順便說一句:你可以通過使用一個讀取文件和另一個掃描匹配來提高多個CPU的性能,但我想上面已經給你提供了足夠的性能提升。

+0

謝謝大家,我會閱讀這些建議! – noobie 2013-04-21 22:11:23