2010-07-22 66 views
1

我的程序使用兩個大型文本文件(百萬行)。這些文件被解析並加載到散列中,以便可以快速訪問數據。我面臨的問題是,目前解析和加載是程序中最慢的部分。以下是完成此操作的代碼。增加大文件的加載速度

database = extractDatabase(@type).chomp("fasta") + "yml" 
revDatabase = extractDatabase(@type + "-r").chomp("fasta.reverse") + "yml" 
@proteins = Hash.new 
@decoyProteins = Hash.new 

File.open(database, "r").each_line do |line| 
    parts = line.split(": ") 
    @proteins[parts[0]] = parts[1] 
end 

File.open(revDatabase, "r").each_line do |line| 
    parts = line.split(": ") 
    @decoyProteins[parts[0]] = parts[1] 
end 

這些文件看起來像下面的例子。它以YAML文件開頭,但格式被修改以提高分析速度。

MTMDK: P31946 Q14624 Q14624-2 B5BU24 B7ZKJ8 B7Z545 Q4VY19 B2RMS9 B7Z544 Q4VY20 
MTMDKSELVQK: P31946 B5BU24 Q4VY19 Q4VY20 
.... 

我搞砸周圍設置文件和解析他們的不同的方式,到目前爲止,這是最快的途徑,但它仍然非常緩慢。

有沒有辦法提高這個速度,還是有其他方法可以採取?

的事情列表不工作

  • YAML。
  • 標準Ruby線程。
  • 分離進程,然後通過管道檢索散列。
+0

如何編寫C擴展? – CodeJoust 2010-07-22 20:44:20

+0

您使用的是Ruby 1.8還是1.9? 1.9可以比1.8快10-20%(在這種情況下,這是一個更大的增長)。 – Digikata 2010-07-22 22:40:08

+0

我正在使用1.9.1 – 2010-07-23 17:33:15

回答

2

在我的使用中,在解析之前將文件全部或部分讀入內存通常會更快。如果數據庫的規模很小,這可能是一樣簡單

buffer = File.readlines(database) 
buffer.each do |line| 
    ... 
end 

如果他們太大,不適合到內存中,它變得更加複雜,你必須設置數據,然後解析,或螺紋的塊讀取具有獨立的讀取和解析線程。

+0

這確實颳了大約30秒,但它仍然需要2分鐘。 – 2010-07-22 21:59:25

+0

我發現這樣做後,對該方法進行其他改動減少了時間。有了這個和其他改進,現在已經到了可以接受的時間。 – 2010-08-09 17:23:09

0

我不太瞭解Ruby,但之前我不得不面對這個問題。我發現最好的辦法是將文件分割成塊或單獨的文件,然後產生線程一次讀取每個塊。一旦分區文件在內存中,結果應該很快。這裏是的Ruby on線程的一些信息:

http://rubylearning.com/satishtalim/ruby_threads.html

希望有所幫助。

+0

分割它真的有幫助嗎?因爲,正如我提到的那樣,當我爲每個文件使用線程時,它只會變慢。 – 2010-07-22 20:54:50

2

爲什麼不使用通過數十年經驗設計的解決方案:數據庫,比如SQLlite3?

+0

+1,儘管在簡單鍵/值的「一次加載」階段之後,這可能不太好。另一種選擇是BDB風格(Berkley-DB)風格的後端,如果它只是一個簡單的鍵/值存儲,而不需要額外的SQL關係和連接。 – 2010-07-22 21:02:04

1

(是不同的,雖然我第一次建議尋找(Ruby) BDB等「NoSQL的」後端 - 發動機,是否符合您的需求。)

如果固定大小的記錄具有確定性指數是那麼您可以通過代理對象執行每個項目的延遲加載。這將是mmap的合適候選人。但是,這將會加快總訪問時間,但是隻會在程序的整個生命週期中緩衝負載(至少在第一次使用之前,並且如果從未使用某些數據,那麼您將獲得永不加載它的好處) )。沒有固定大小的記錄或確定性索引值,這個問題就更加複雜,並且開始看起來更像傳統的「索引」存儲(例如,SQL後端中的B樹或任何BDB使用:-)。

與線程這裏的一般問題是:

  1. 的IO將可能左右紅寶石「綠色」主題的瓶頸
  2. 你仍然需要在使用前的所有數據

您可能對Widefinder Project感興趣,只是一般「試圖獲得更快的IO處理」。

+0

創建數據庫所花的時間令人無法忍受。 – 2010-08-09 17:21:05