2011-11-30 83 views
0

我對處理大文件和內存約束的經驗非常少。 請注意,我使用Java作爲編程語言。寫入文件時哪一個更快?

我必須找到文件大小爲15GB的記錄,然後將結果寫入另一個文件。基本上它是一個搜索範圍功能的實現。我的目標是將我範圍內的記錄寫入以換行符分隔的結果文件。那就是每個記錄應該分開來。這些查詢的數量大約是400-1000。所以每個查詢都會導致寫入許多記錄在其範圍內。

那麼以下哪種方法更快?

1-只要我開始獲取查詢範圍記錄,我就開始將它們寫入文件串行?

2-我在一些字符串中存儲我的記錄,並在每個找到的記錄的字符串中追加,然後最後寫入它?

3-使用字符串生成器來連接每個查詢的結果,然後在最後寫入文件?但字符串生成器不支持新行。

4-建立我自己的數據結構?

5-製作記錄數組列表,然後在最後遍歷它以寫入文件?

請讓我知道哪種方法在IO和MM方面都是最快的。

+0

嗯,我們不能使用數據庫,因爲它是一個項目來構建數據庫,所以我們不能使用任何提供索引或數據庫相關功能的庫。對不起,你沒有標記回答的問題是什麼意思?你在談論關於堆棧溢出問題以外的其他問題嗎?謝謝 ! – Basmah

+0

不是說StringBuilder是最好的解決方案,但我幾乎積極支持換行 –

回答

4

OS級別的寫入緩衝非常有效。除非你有探查數據表明存在問題,否則請去#1。

+0

oKAY謝謝!我正在嘗試這個。 – Basmah

+0

+1:不要忘記使用像BufferedOutputStream這樣的緩衝區。如果你的程序足夠高效,你的瓶頸很可能是I/O。 –

0

2和3都聽起來像是自制的緩衝實現。一個更簡單和更有效的方法是做#1,但用BufferedOutputStream包裝你的FileOutputStream

如果您正在討論大量記錄,那麼編號5可能是個壞主意,因爲您實際上可能會導致交換(這隻會影響性能)。

+0

RandomAccessFile怎麼樣?好嗎? – Basmah

+0

我到目前爲止使用的方法是,我將記錄寫入大小等於PageSize(4096K)的緩衝區,然後使用Java隨機訪問文件。寫字符寫一個頁面大小的字符串緩衝區。但似乎你告訴我的方法要快得多。所以,現在我會嘗試使用這個。謝謝 ! – Basmah

0

我認爲Map and Reduce最適合這個。我沒有在這方面工作,但參加了同樣的一個會議,這傢伙使用相同的例子。分割你的文件,並讓多個程序運行相同的搜索查詢 - 地圖,然後一旦搜索完成,所有的答案可以合併成一個使用Reduce

+0

其實我的鑰匙不是唯一的。我的數據只有兩列,一列是關鍵字,另一列是值。關鍵是可變大小,範圍從7-15位,並且鍵也在數據中重複。所以我懷疑我是否可以對密鑰使用散列,因爲MapReduce對密鑰使用散列。非常感謝你的建議。 – Basmah