2012-03-12 69 views
1

可能重複:
How to refer to children in a tree with millions of nodes內存異常

我想實現一個樹將舉行幾百萬個節點,這反過來又可以擁有孩子的數目不詳節點。爲了達到這個目的(因爲每個節點可以有多個子節點),我在一個Dictionary數據結構中存儲了一個節點的子節點。因此,當創建每個對象節點(數以百萬計)時,我有一個節點對象,其中包含存儲在相應節點中的字符值,以及一個單獨的Dictionary結構,該結構持有對子節點的引用。

我的樹適用於幾千個節點,但是當它到達數百萬個節點時,會發生內存不足異常。這是由於在內存中運行的數百萬個節點中的每一個都有其自己的字典?即我有數百萬個對象在運行?

我需要讓這些對象在內存中運行,並且不能使用文件或數據庫。任何人都可以提出解決方案

+3

這會對你有什麼好處?它是否可讀?爲什麼你不能使用文件或數據庫? – 2012-03-12 15:39:18

+0

您可以將字典對象更改爲一個數組。 – mydogisbox 2012-03-12 15:40:42

+3

你能告訴我們你的Node類的結構嗎? – Tudor 2012-03-12 15:41:20

回答

1

您可以嘗試使用64位的Windows並以64位編譯程序。這會給你更多的內存......這不是一個神奇的子彈(對於多大的內存結構仍然有限制)

+1

@KeithS我很高興你這麼認爲,但實際上它完全不同。一個對象被限制爲2 GB(因此Dor Cohen建議BigArray的原因) – xanatos 2012-03-12 15:53:50

+0

KeithS:我認爲這是不正確的:http://stackoverflow.com/questions/982051/net-max-memory-use-2gb-even - 用於-x64的組件 – thecoop 2012-03-12 15:54:49

1

解決方案不會是eas年。

選項包括:

  1. 卸載其中的一些節點的磁盤,你有「工作區」的一個更大的量來處理。只在內存中加載真正需要在那裏的東西。由於磁盤和RAM速度的根本區別,這可能會導致巨大的性能損失。

  2. 增加機器中的RAM容量以適應您正在做的事情。這可能需要轉移到64位(如果它目前是一個32位應用程序)。根據您的實際內存要求,這可能會非常昂貴。當然,如果你現在有一個32位的應用程序,並有足夠的RAM可用,切換到64位將至少讓你在3到4GB範圍以上...

  3. 流線每個節點有一個很多更小的佔地面積。換句話說,您是否需要Dictionary提供的所有內容,或者只需要一個結構來定義與其他節點的左右鏈接?基本上,看看你如何處理這個問題,並看看處理樹數據結構的傳統方法。

2

您的OOM異常可能是由於LOH碎片,而不是實際內存不足。您可以嘗試切換到使用紅黑樹的SortedDictionary,而不是使用散列表的Dictionary,並查看是否改進了問題。或者你可以實現你自己的樹結構。

0

如果你唯一的限制是沒有文件訪問(如果你反對任何一種數據庫,這個答案是沒有意義的),我可以建議的另一種解決方案是使用內存數據庫(如SQlite)或其他的東西提供類似的功能。這將在很多方面爲你提供幫助,其中最重要的是數據庫將爲你執行內存管理,並且有許多經過驗證的算法可以將大樹存儲在數據庫中,這些算法可以適應。

希望這會有所幫助!