在asp.net应用程序中给出Dictionary<T, U>
。应用程序运行了很长时间,新元素将不断添加到字典中。我的目标是尽可能地在Dictionary中保留这么多元素,而不会出现“内存溢出”或其他副作用。我应该如何清理集合,为新元素释放一些内存,删除旧元素?如何检查有多少旧元素以及何时应该删除元素?
答案 0 :(得分:5)
你签出了Application.Cache
吗?
听起来像是你需要的......
http://msdn.microsoft.com/en-us/library/ms178597(v=vs.100).aspx
引用:
使用应用程序缓存的优点是ASP.NET管理缓存并在项目过期或失效时或内存不足时删除项目。
答案 1 :(得分:3)
这不是一项简单的任务。听起来好像你在使用字典作为缓存,在这种情况下你应该查看standard caching for asp.net。
那说你可以选择不同的策略。您可以选择在字典中设置所需元素数量的上限。这可以通过使用包含元素的链接列表并让字典存储LinkedListElement<U>
来完成。当您从字典中检索某些内容时,将LinkedListElement<U>
移动到链接列表的前面。这样,您始终可以在列表顶部使用最新元素。插入元素时,将它们添加到链接列表和字典中,并测试是否满足字典大小限制。如果是,则从链接列表底部和字典中删除元素。
记住锁定!
答案 2 :(得分:2)
由于您使用的是托管语言,因此您在管理内存方面的限制以及手动内存释放或强制垃圾收集器的做法都被视为次优。
因此,没有直接的方法可以说明您的通用字典可以保留多少元素以及您仍可以声明的内存量。同时从字典中删除一些旧值不会自动导致可用内存的立即增加。
这就是说,你可以使用GC.GetTotalMemory监控当前分配给你的应用程序的内存(只要你的对象是完全可管理的,例如不包含非托管代码或数据块),并将它与整个系统内存进行比较可用于申请。
或者,如果您知道放入Dictionary<>
的对象的大小,您可能会对使用MemoryFailPoint类感兴趣,该类将告诉您是否可以创建给定大小的新对象或者不是,所以你不会碰到OutOfMemory
例外并且有时间释放一些资源。
最后,如果您使用字典作为缓存,ASP.NET中有一些内置缓存提供程序,请阅读from here。在内存压力的情况下,缓存将自动删除过时或过时的对象。