2015-09-24 125 views
0

所以我沒有真正做過任何嚴肅的多線程(除了典型的for-loop教科書示例),所以我想我可以試試看。我試圖完成的任務如下:使用多線程來讀取使用Java的文件/處理?

一旦鑑定發現
  1. 閱讀從一個叫ids.txt
  2. 搜索該識別碼在一個名爲sequence.txt
  3. 一個單獨的文件的文件識別碼,提取物id後面的字符串。
  4. 創建一個類型爲DataSequence(它封裝了標識碼和提取的序列)的對象並將其添加到ArrayList。
  5. 重複3000+個ID。

我在單線程中試過這種「常規」的方式,但過程太慢。我怎樣才能以多線程的方式來解決這個問題?

+1

你能告訴我們一些你試過的代碼嗎?我們不能只給你答案,我們必須告訴你它是如何工作的。 – frenchDolphin

+1

這些文件有多大?是否有可能將它們加載到內存中(特別是'sequence.txt')?無論如何,我強烈建議您在剖析多線程作爲解決方案之前,對您的代碼進行剖析,以確切瞭解時間。如果你要走這條路線,那麼你應該把線程的數量限制在合理的範圍內(例如8或16)。 –

+0

我所擁有的是帶for循環的常規單線程方法。這足夠嗎? –

回答

0

沒有看到分析數據,很難知道要推薦什麼。但作爲一個盲目的猜測,我會說大多數時候反覆打開,搜索和關閉sequence.txt。如果這是猜測是準確的,那麼最大的改進(到目前爲止)將是找到一種方法來僅處理sequence.txt一次。最簡單的方法是將文件中的相關信息讀入內存,從id到後面的字符串構建一個哈希映射。整個文件只有53.3 MB,所以這是一個非常合理的方法。然後,在處理ids.txt時,您只需要從地圖—中查找相關字符串即可快速操作。

另一種方法是使用java.nio類爲sequence.txt創建內存映射文件。

對於尋找多線程來改善似乎是磁盤綁定操作的情況,特別是如果線程最終會爭用對同一文件的訪問(即使它只是讀訪問權限),我會猶豫不決。這並不是我學習多線程技術的一個很好的問題;回報不太可能在那裏。

0

多線程可能是一個矯枉過正的地方。嘗試以下算法方法。 1.以讀取模式打開文件ids.txt 2.聲明用於存儲鍵值對的HashMap 2.循環直到文件結尾 2A。作爲字符串讀取一行 2B。將行解析爲id(key)和行的其餘部分(值)以存儲在HashMap對象中。 3.現在根據需要使用HashMap進行搜索或根據需要執行任何您需要的操作。

注意:在生產者 - 消費者設計框架中,2A和2B可以放入兩個不同線程的兩個不同線程。