我有一个通用的字典,里面存储了大量数据。当字典的大小开始占用过多内存时,我希望能够开始删除一些数据(我知道应该删除哪些数据)。
那么,如何让程序监测这个字典所使用的内存呢?
需要注意的是,字典中的每个条目的大小都是不同的。
那么,如何让程序监测这个字典所使用的内存呢?
需要注意的是,字典中的每个条目的大小都是不同的。
计算每个项目的大小并乘以Dictionary.Count
其中一种方法在此处展示:
An approximate way to determine the size of object usage in memory can be done by checking the total memory before and after the creation of the object. In the following example it is assumed you have a class named 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# 中有一个类似于 C/C++ 的 'sizeof' 运算符,但是它返回的是该类型字段的大小。因此对于引用类型(类而非结构体),它总是返回指针的大小(在 32 位系统上为 4)。建议使用 System.Runtime.InteropServices.Marshal.SizeOf()
代替。
我不相信有任何API可以给出对象的真实大小,但可以通过在创建对象之前和之后测量使用的内存量来确定;然而,这并不是真正的线程安全。
您可以使用System.Runtime.InteropServices.Marshal.SizeOf(),即使这不会给您一个准确的大小,它也会给您一个准确的比较点,以便您可以说:如果对象的大小增加了X%,那么删除Y个元素。
此外,您可以尝试保持运行总数,但如果集合中的项目是可编辑的,则需要确保每个添加,删除和编辑都包含在计算中。您仍然面临正确测量正在添加和删除的项目的问题,如上所述,我不认为有一个API可以准确地完成这项工作。