我在使用大约 12GB 内存的 c# Windows 服务中有一个巨大的数据集。
Dictionary<DateTime,List<List<Item>>>
不断添加新数据流,大约每小时 1GB。旧数据偶尔会被删除。这是网页的高速缓冲区。
我在配置文件中有一个名为“MaxSizeMB”的参数。我想允许用户输入,比如“11000”,每次应用超过 11GB 的 ram 使用时,我的应用都会删除一些旧数据。
事实证明,这非常困难。
您可能认为您可以调用 GC.GetTotalMemory(false)。这将为您提供 .net 托管对象的内存使用情况(假装它说的是 10.8GB)。然后,您只需添加一个恒定的 200MB 作为应用程序中分配的所有其他内容的安全网。
这行不通。事实上,加载的数据越多,GC.GetTotalMemory 和任务管理器的区别就越大。我什至试图计算出一个常量乘数而不是一个常量加值,但我无法得到一致的结果。到目前为止,我所做的最好的事情是计算数据结构中的项目总数,乘以 96,并假装该数字是 ram 使用情况。这也令人困惑,因为 Item 对象是一个 32 字节的结构。这种假装的ram使用也太不稳定了。有时应用程序会删除 11GB 的旧数据,但有时它会删除 8GB 内存使用量的数据,因为我假装的数字计算出一个错误的 11GB。
所以我可以使用这种保守的假 ram 计算,并且经常不使用我允许使用的所有 ram(比如丢失 2GB),或者我可以使用 GC.GetTotalMemory,客户会因为应用程序运行失败而感到害怕偶尔设置 ram。
有什么方法可以在不超过任务管理器中显示的限制的情况下使用尽可能多的内存?我不在乎数学是不是乘数、常数增值、幂等。我想将数据填充到数据结构中,并在达到最大设置时删除数据。
注意:我已经做了一些内存压缩技术,例如使用结构作为项目、list.Capacity = list.Count 和 GC.Collect(GC.MaxGeneration)。不过,这些似乎是一个单独的问题。
最佳答案
使用 System.Diagnostics.PerformanceCounter
并监控您当前的进程内存使用情况和可用内存,基于此,您的应用程序应决定是否删除某些内容..
关于c# - 我怎样才能确定一个巨大的 C# 数据集的内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21611352/