1

给定Dictionary<T, U>在 asp.net 应用程序中。应用程序运行很长时间,新元素将不断添加到字典中。我的目标是尽可能多地保留 Dictionary 中的元素,而不会出现“内存溢出”或其他副作用。我应该如何清理集合以通过删除旧元素为新元素腾出一些内存?如何检查有多少旧元素以及何时应该删除元素?

4

3 回答 3

5

你检查了Application.Cache吗?
在我看来,这正是你所需要的......

http://msdn.microsoft.com/en-us/library/ms178597(v=vs.100).aspx

引用:

使用应用程序缓存的优点是 ASP.NET 管理缓存并在项目过期或失效或内存不足时将其删除。

于 2013-06-19T09:55:54.233 回答
3

这不是一项简单的任务。听起来好像您正在使用字典作为缓存,在这种情况下,您应该查看asp.net 的标准缓存

也就是说,您可以选择不同的策略。您可以选择设置字典中所需元素数量的上限。这可以通过拥有一个包含元素的链表并让字典存储LinkedListElement<U>. 当您从字典中检索某些内容时,您会将 移动LinkedListElement<U>到链接列表的前面。这样,您始终可以将最新的元素放在列表的顶部。插入元素时,将它们添加到链表和字典中,并测试是否满足字典大小限制。如果是,则从链表和字典的底部删除元素。

记得锁定!

于 2013-06-19T09:56:56.840 回答
2

由于您使用的是托管语言,因此您管理内存的方式受到限制,并且手动释放内存或强制垃圾收集器的做法都被认为是次优的。

因此,没有直接的方法来说明您的通用字典允许保留多少元素以及您仍然可以要求多少内存。同时从字典中删除一些旧值不会自动导致可用内存立即增加。

这就是说,您可以使用GC.GetTotalMemory继续监视当前分配给您的应用程序的内存(只要您的对象是完全可管理的,例如不包含非托管代码或数据块)并将其与应用程序可用的总系统内存进行比较。

或者,如果您知道放入 中的对象的大小,您可能会对使用MemoryFailPointDictionary<>类感兴趣,该类会告诉您是否可以创建给定大小的新对象,因此您不会遇到异常并有时间释放一些资源。OutOfMemory

最后,如果您将字典用作缓存,ASP.NET 中有一些内置的缓存提供程序,请从此处读取。在内存压力的情况下,缓存将自动删除过时或旧的对象。

于 2013-06-19T10:06:57.373 回答