2011-07-17 61 views
5

我有一組圖像存儲在Int16類型的3D數組中,我緩存的圖像數量可以達到600或更多,這會影響垃圾收集性能的內存性能。 我聽說可以增強內存管理的內存平鋪,因爲它將子數組元素設置在單獨的塊中。
- 我可以在我的情況下使用內存平鋪嗎?
- 如果是,我該如何使用它?內存平鋪管理和大對象c#

+1

你的數組是如何定義的? 'new short [n] [] []'或'new short [x,y,z]'?換句話說,它真的是一個多維數組還是它是一個鋸齒形數組?你怎麼知道它會影響GC的性能? – svick

+1

600-ish物體什麼也沒有。抓住一個內存分析器,看看到底發生了什麼。 – sisve

+0

@svick @svick我的數組是短[x,y,z]形式,因爲我搜索了很多內存泄漏的原因,我發現大對象影響GC的性能,有些人不得不打電話給GC。在這種情況下收集,所以最好短[x,y,z]或短[x] [y] [z] ?,感謝您的回覆 –

回答

3

我可以在我的情況下使用內存平鋪嗎?

是的。一個int16 [,,]的3d數組必須是一個內存塊。把它放入切片中,它們已經變小了。 ([] [,])。

其餘取決於您的確切需求。

+0

so short [x] [y,z]是優於[x,y,z]。最好是短[x] [y] [z]是我明白的是對的? –

+1

@Sara,這遠非如此簡單。什麼形式更好取決於你在做什麼。 – svick

+0

是的。因爲它不是一個大塊(每個陣列都是一個),所以使用存儲器是最好的選擇,但最佳大小取決於您的確切需求。這很複雜。例如,我使用的緩衝區最多可以循環4MB(有一個未使用的隊列)。 – TomTom

1

垃圾收集將受益於收集儘可能少的東西。多維陣列將被視爲一個單個分配:

short[,,] a = new short[2,3,4]; 

鋸齒狀陣列將使用許多不同分配。它更小的分配大小可能會更快分配,但它可能把更多的應變在GC回收期間:

short[][][] a = new short[2][][]; 

我從來沒有聽說過「記憶拼接」之前,因此,如果你能解釋那是什麼,我可能會更好地回答你的問題。

+0

許多計算機應用程序都需要處理大數據數組。由於較差的內存訪問模式,這些應用程序在分頁虛擬內存(VM)系統下可能表現不佳。這個問題的一個解決方案是平鋪,這種技術將 陣列劃分爲與VM頁面一對一映射的子陣列。 ==>從此pdf複製:http://www.usenix.org/publications/library/proceedings/sa92/franklin.pdf –