簡體   English   中英

C#/ .NET:字典內存使用情況

[英]C#/.NET: Dictionary memory usage

我有一個包含大量數據的通用詞典。 當Dictionary的大小開始占用太多內存時,我想開始刪除項目(我知道如何確定哪些項目)。

我的程序監視此詞典使用的RAM的最佳方法是什么?

字典中的每個項目都是可變大小。

計算出每個項目的大小,並乘以Dictionary.Count

這里顯示一種方法:

確定內存中對象使用大小的近似方法可以通過在創建對象之前和之后檢查總內存來完成。 在以下示例中,假設您有一個名為foo的類。

 long StopBytes = 0; foo myFoo; long StartBytes = System.GC.GetTotalMemory(true); myFoo = new foo(); StopBytes = System.GC.GetTotalMemory(true); GC.KeepAlive(myFoo); // This ensures a reference to object keeps object in memory MessageBox.Show("Size is " + ((long)(StopBytes - StartBytes)).ToString()); 

C#有一個'sizeof'運算符,它的工作方式與在C / C ++中的運行方式相同,但它返回的是該類型字段的大小。 因此,對於引用類型(類,而不是struct),它將始終返回指針的大小(32位系統上的4)。 請改用System.Runtime.InteropServices.Marshal.SizeOf()

我不相信有任何API可以提供對象的真實大小,但可以通過測量創建對象之前和之后使用的內存量來確定; 但是,這不是真正的線程安全。

您可以使用System.Runtime.InteropServices.Marshal.SizeOf(),即使這不會給您一個准確的大小,它會為您提供一個准確的比較點,以便您可以這樣說:如果對象的大小增加X%然后刪除Y個元素。

此外,您可以嘗試保持運行總計,但如果集合中的項目是可編輯的,則需要確保計算中包含每個添加,刪除和編輯。 您仍然存在正確測量正在添加和刪除的項目的問題,如上所述,我不相信有一個API可以准確地執行此操作。

當您向Dictionary添加內容時,計算項目添加的大小並將每個添加項目的總和保持為單個int值,當您從字典中刪除項目時減少此值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM