2013-08-21 139 views
2

我的應用程序需要使用大小高達5 GB的文本文件中的數據。我無法將所有這些數據加載到RAM中,因爲它太大了。如何在Java中處理大數據?

數據存儲爲一個表格,500萬條記錄(行)和40列,每個記錄包含將在內存中轉換爲字符串,整數或雙精度的文本。

我試過緩存只有10 - 100 MB的數據在內存中,並從文件重新加載時,我需要外面的數據,但它太慢了!當我運行計算時,因爲我可以從表中的任意行隨機跳轉,它將不斷需要打開文件,讀取和關閉。

我需要的東西很快,我正在考慮使用某種數據庫。我知道像這樣的大數據計算可能需要一段時間,這很好。如果我使用數據庫,則需要在啓動桌面應用程序時進行設置,而不需要以前安裝某種服務器組件。

任何提示?謝謝

+1

您應該使用SQLite。 – SLaks

+0

記錄是否有固定大小?外部數據庫系統是可接受的解決方案嗎? – Joni

+0

不是一個固定的大小,可以隨時更改我加載一個不同的文件。 – user2704766

回答

2

我認爲你需要澄清一些事情:

  • 這是桌面應用程序(我認爲是),什麼是它的內存限制?
  • 你是否以只讀模式使用你的文件?
  • 你想要做什麼樣的計算? (隨機行的訪問頻率,隨之而來的行如何經常閱讀,你需要修改數據)

目前我看到進一步調查兩種方式:

  • 使用SQLite。這是一個小型的單文件數據庫,主要面向桌面應用程序和單用戶使用。它不需要任何服務器,只需要有適當的jdbc庫。
  • 使用例如二叉樹創建某種索引。第一次讀取文件時,索引文件中行的起始位置。結合永久打開random access file這將幫助您快速尋找並快速讀取所需的行。對於二叉樹,您的索引可能大約爲120M。 (它是二叉樹的RowsCount * 2 * IndexValueSize)
+0

嗨,謝謝你的迴應。 是的,它是一個桌面應用程序,內存限制在2 GB左右。 文件是隻讀的 計算是在用戶請求完成時完成的,當他們選擇這樣做時,計算線程將運行,並將遍歷每個數據段(從文件加載的表中的單元格),直到它完成。這就是說有另一種計算功能,可以隨機訪問多達幾千行。 – user2704766

+0

從您的文件「正在運行」創建數據庫表將是相當繁重的操作。如果你可以改變數據存儲方式,我建議用一些輕量級數據庫(比如SQLite)中的表來完全替換「文件中的表」。 – Aivean

+0

或者你可以考慮創建一些預計算。我不知道你做了什麼確切的計算,但試着想一下,如果你能以某種方式聚合你的數據,這樣它可以適應內存。 但無論如何,使用輕量級數據庫進行數據存儲似乎是最便宜且速度最快的解決方案。 – Aivean

2

你可以使用嵌入式數據庫,你可以在這裏找到一個比較:Java Embedded Databases Comparison

或者,根據您的使用情況,您甚至可以嘗試使用Lucene這是一個全文搜索引擎。

+0

謝謝,我會看看H2。 SQlite有什麼缺點? – user2704766

+0

@ user2704766不知道,只是另一個鏈接;)http://database-management-systems.findthebest.com/compare/16-53/H2-vs-SQLite – Katona