【问题标题】:C#/.NET: Dictionary memory usageC#/.NET:字典内存使用
【发布时间】:2009-05-12 02:03:39
【问题描述】:

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

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

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

【问题讨论】:

标签: c# .net dictionary


【解决方案1】:

计算出每个项目的大小并乘以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++ 中的一样,但它返回该类型字段的大小。因此对于引用类型(类,而不是结构),它将始终返回指针的大小(在 32 位系统上为 4)。请改用System.Runtime.InteropServices.Marshal.SizeOf()

【讨论】:

  • "计算出每个项目的大小。"怎么样?
  • 如上所述,这不是线程安全的,实际上可能返回一个负数。
  • @jellomonkey:是的,但不太可能。我不建议他在实际的生产代码中这样做;而是在测试项目中确定大小(假设它们不会经常更改)。
【解决方案2】:

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

您可以使用 System.Runtime.InteropServices.Marshal.SizeOf() 即使这不会为您提供准确的大小,但它会为您提供准确的比较点,以便您可以说:如果对象的大小增加X% 然后删除 Y 个元素。

此外,您可以尝试保持运行总计,但如果集合中的项目是可编辑的,您将需要确保每次添加、删除和编辑都包含在计算中。您仍然面临正确测量添加和删除项目的问题,如上所述,我不相信有一个 API 可以准确地做到这一点。

【讨论】:

    【解决方案3】:

    当您向字典添加内容时,计算添加项的大小并将每个添加项的总和保持为单个 int 值,当您从字典中删除项时减少此值。

    【讨论】:

    • 如何计算一个项目的大小?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2023-03-05
    • 2013-12-24
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多