我有一个包含大量数据的通用词典。当Dictionary的大小开始占用太多内存时,我想开始删除项目(我知道如何确定哪些项目)。
我的程序监控此词典使用的RAM的最佳方法是什么?
词典中的每个项目都是可变大小。
答案 0 :(得分:5)
计算每个项目的大小并乘以Dictionary.Count
显示了一种方式here:
确定的近似方法 内存中对象使用的大小可以是 通过检查总内存来完成 在创建之前和之后 宾语。在下面的例子中 假设你有一个名为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()
。
答案 1 :(得分:1)
我不相信有任何API可以提供对象的真实大小,但可以通过测量创建对象之前和之后使用的内存量来确定;但是,这不是真正的线程安全。
你可以使用System.Runtime.InteropServices.Marshal.SizeOf(),即使这不会给你一个准确的大小,它会给你一个准确的比较点,这样你就可以说:如果对象的大小增加按X%然后删除Y个元素。
此外,您可以尝试保持运行总计,但如果集合中的项目是可编辑的,则需要确保计算中包含每个添加,删除和编辑。您仍然存在正确测量正在添加和删除的项目的问题,如上所述,我不相信有一个API可以准确地执行此操作。
答案 2 :(得分:-1)
当您向Dictionary添加内容时,计算项目添加的大小并将每个添加项目的总和保持为单个int值,当您从词典中删除项目时会减少此值。