2011-01-11 67 views
1

我有一個內存問題,我完全瞭解原因,但不知道修復。我試圖使用-Xmx2g標記並使堆大小變大,但似乎存在隱藏的最大值。 (如果我使用了-Xmx512m,我同時用完了空間)。使用巨大的ArrayLists,Java OutOfMemoryError:Java堆空間...使用db?

假設我有2個對象,一個區域和一個用戶。我區對象保存用戶的ArrayList:

public class Area { 
     int numUsers; 
     ArrayList<User> userList; 
} 

我的User類持有的朋友一個ArrayList:

public class User { 
     int userID; 
     int numFriends; 
     ArrayList<User> friends; 
} 

只使用一個領域,有100萬個用戶,每一個平均的200個朋友用戶,在創建約680,000個用戶之後,我用完了堆空間。顯然,如果我將朋友/用戶的平均數量降低到接近100的數量,我可以將所有這些對象存儲在堆中。

如果我想模擬一個地區的200萬用戶該怎麼辦?還是數百個地區的?

有了這麼多的數據,數據庫是使用信息進行模擬的唯一可行的方法嗎?

+0

是的,將這種大小的圖表擬合到單個虛擬機中將會變得侷促。不,除了關係數據庫之外,還有很多方法可以保存和處理大量數據。你的情況適合哪種方式取決於你想要對數據做什麼,以及你的性能要求是什麼。 Perpahs甚至可以根據需要創建數據,避免將其存儲在整個數據中? – meriton 2011-01-11 20:24:13

+0

需要存儲它的全部內容最終會有多個區域,其中來自區域1的一些用戶可以有來自區域42的朋友。我認爲將它存儲在內存中不會成爲此時的選項。在這一點上,我只需要模擬這些信息。該項目需要一個真實的社交網絡模型。我應該研究你知道的任何結構嗎? – Eddie 2011-01-11 20:45:30

+0

在內存中存儲可能會走得很遠。目前的內存價格爲100歐元/ 8GByte,大多數系統不應該是基於磁盤的。 – 2011-01-11 22:20:27

回答

1

當然,你可以在64位Java上運行超過2米,但這不能解決問題。順便說一句,對於Area來說,你可能需要id(不是numUsers),可以從list.size()獲得用戶/朋友的數量。

數據庫/磁盤存儲是表示很多對象的自然解決方案,可以選擇使用服務器集羣

(跑了一大盒W/500 + GB的內存旁邊)要回答你必須提供更多的數據的問題:什麼是區域/朋友圖表的/ etc點。


如果你可以用代碼字節緩衝區(這可能不是一件容易的事)你自己的結構(URE),你可以去超越java.io.MappedByteBuffer,與ScatteringByteChannel /與GatheringByteChannel 32位的限制。但是,這不是一個新手任務,但如果你喜歡編程,我建議你試試看。

祝你好運與你的學習。

+0

在創建區域之前,實際將用戶數傳遞到該區域。通過這種方式,當我使用不同數量的用戶創建多個區域時,我可以做到這一點。並且每個用戶都有自己的ID。 這是一個學校項目,用於創建一個現實的社交網絡模型。 – Eddie 2011-01-11 20:23:47

0

要訪問更多堆內存,請移至64位操作系統和64位JVM。如果您使用-Xmx512m遇到問題,則使用32位操作系統和/或JVM。

1

磁盤/數據庫僅僅是一個解決方案,如果你能負擔得起的隨機訪問性能的因素100.000損失(你可能有很多的系統使用一個數據庫)。你可以用專門的數據結構做得更好。爲完全連接的子網做一些特殊的事情可能會節省很多空間。

相關問題