C#/ .NET:字典内存使用情况

时间:2009-05-12 02:03:39

标签: c# .net dictionary

我有一个包含大量数据的通用词典。当Dictionary的大小开始占用太多内存时,我想开始删除项目(我知道如何确定哪些项目)。

我的程序监控此词典使用的RAM的最佳方法是什么?

词典中的每个项目都是可变大小。

3 个答案:

答案 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值,当您从词典中删除项目时会减少此值。