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

6
我有一个通用的字典,里面存储了大量数据。当字典的大小开始占用过多内存时,我希望能够开始删除一些数据(我知道应该删除哪些数据)。
那么,如何让程序监测这个字典所使用的内存呢?
需要注意的是,字典中的每个条目的大小都是不同的。

为什么不使用ASP.NET缓存?它可以在没有任何HTTP上下文的情况下工作,并且具有您所要求的功能...(http://www.hanselman.com/blog/UsingTheASPNETCacheOutsideOfASPNET.aspx) - user57508
3个回答

5

计算每个项目的大小并乘以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() 代替。


1
如何计算每个项的大小? - BFree
如上所述,这并不是线程安全的,实际上可能会返回负数。 - jellomonkey
1
@jellomonkey:没错,但不太可能。我不建议他在实际的生产代码中这样做;而是在一个测试项目中确定大小(假设它们不会经常更改)。 - Mitch Wheat

1

我不相信有任何API可以给出对象的真实大小,但可以通过在创建对象之前和之后测量使用的内存量来确定;然而,这并不是真正的线程安全。

您可以使用System.Runtime.InteropServices.Marshal.SizeOf(),即使这不会给您一个准确的大小,它也会给您一个准确的比较点,以便您可以说:如果对象的大小增加了X%,那么删除Y个元素。

此外,您可以尝试保持运行总数,但如果集合中的项目是可编辑的,则需要确保每个添加,删除和编辑都包含在计算中。您仍然面临正确测量正在添加和删除的项目的问题,如上所述,我不认为有一个API可以准确地完成这项工作。


-1
当你向字典中添加内容时,计算要添加的项的大小,并将每个添加的项的总和作为单个整数值保留。当你从字典中移除项时,减少该值。

1
一个如何计算物品大小的方法是什么? - stakx - no longer contributing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接