2010-07-17 50 views
2

任何人都可以幫我解決以下問題嗎? 我需要永久保存我今天在數組中的內容,以便稍後使用這些數據進行計算。我在下面解釋一個例子。如何在Java中存儲(並讀取)大型數組/地圖/任何東西?

1,我生成一個很長的[] [],這對我的電腦RAM來說太大了。它是一行接一行地產生的。

2,我從我的long [] []中計算出一些東西,並將結果保存在一個double [] []中 - 對我的RAM來說也太大了。我不需要同時使用整個long [] [],因爲同時在計算中使用了一小批行,並且在每個批處理中填充了double [] []中的一行。

3,我需要對double [] []進行排序,並做很多其他不重要的事情。

4,我重複步驟2和3的迭代次數很多(大於10000),這意味着我關心訪問和排序的速度。我知道數組的大小,但顯然我不能初始化它們,因爲它們太大了,也因爲它必須由int初始化(到目前爲止,我只能運行「小」計算)。當然,我可以使用地圖等,但我沒有得到這個工作,我不明白我應該使用哪種(s)。我以前從未使用過地圖/集合等。在後一種情況下,我可以使用數組中的一列作爲鍵,因爲它們是相同的(除了類型)。關鍵可能只是行號(表示爲長)。

最好,我想解決這個問題,而不使用需要安裝服務器的數據庫,因爲我的程序將被我以外的人使用。

我非常感激任何幫助和建議!

回答

1

要存儲此數據,您可以使用netcdfhdf5。您可以獲取並保存數組的子集。

+0

感謝您的建議! 他們都看起來很有前途。 – EvoMangan 2010-07-17 15:36:26

2

如果數組大於可以存儲在您計算機的RAM中,那麼很明顯,您應該將數組的一部分或全部存儲在磁盤上。

爲此,您可以使用數據庫。既然您不想安裝服務器,則可以使用嵌入式數據庫,如HSQLDB。您可以將HSQLDB配置爲在應用程序終止時刪除所有數據或將其保留以供將來使用。

另一種方法是使用自定義的Map實現,當數據大小增加超過您定義的閾值時,將數據刷新到輔助存儲。爲此,可以使用多種策略:FIFO,LIFO,LRU等。另外,無論何時需要訪問映射的某個元素,您都可以從磁盤加載大量相鄰元素(或者再次使用策略更適合您的使用情況)來減少過多的磁盤I/O。

+0

太棒了! 我將測試替代方案,以瞭解哪種方法是最有效的方法。我猜HSQLDB是最簡單的。 非常感謝! – EvoMangan 2010-07-17 15:46:41

0

管理數據子集很可能是最好的解決方案。

但是,您應該問問自己,如果您使用正確的機器進行工作。您可以購買一臺新的PC,Core 2 Duo 2.5 GHz,內存爲4 Gb,售價爲225英鎊。你可以以380英鎊的價格買8GB的四核心AMD處理器。您可以購買320 GB的16 GB內存。

我的觀點是,你的時間有價值,你需要權衡現在和將來需要花費多少工作來節省一些內存和多少內存是值得的。

+0

呃......是的,電腦很便宜,特別是如果你(像我)只能接受一個「寬鬆」的主板,一捆電纜和Linux。儘管如此,人們總是會想要做更多的事情,還有更多......就我而言,我可以用我的電腦測試一些小東西,但只要我想分析更有趣的東西,RAM就不夠了。 – EvoMangan 2010-07-20 21:52:43

+0

在這種情況下,您需要創建一個類似於數組的類,而是管理實際存儲在內存中的「數組」的多少。基本上你需要一個長整數的get(int x,int y)方法。你有多少內存只是一個緩存問題。實現這一點的一種方法是使用內存映射文件。如果你這樣做,你的數據大小會受到磁盤空間的限制,而磁盤空間比內存便宜(但速度並不快)! – 2010-07-21 20:28:33

相關問題