如何通过删除旧元素来清理字典
本文关键字:字典 元素 何通过 删除 | 更新日期: 2023-09-27 18:18:57
给定的是asp.net应用程序中的Dictionary<T, U>
。应用程序运行了很长时间,新的元素将不断添加到字典中。我的目标是保持尽可能多的元素在字典中,没有"内存溢出"或其他副作用。我应该如何清理集合,通过删除旧元素来为新元素提供一些内存空间?如何检查有多少旧元素以及何时应该删除元素?
您检查过Application.Cache
了吗?
在我看来,这正是你所需要的……
http://msdn.microsoft.com/en-us/library/ms178597 (v = vs.100) . aspx
:
使用应用程序缓存的优点是:. NET管理缓存,并在项过期或失效或内存不足时删除项。
这不是一项简单的任务。听起来好像你正在使用字典作为缓存,在这种情况下,你应该看看asp.net的标准缓存。
也就是说你可以选择不同的策略。您可以选择设置字典中所需元素数量的上限。这可以通过拥有一个带有元素的链表并让字典存储LinkedListElement<U>
来完成。当您从字典中检索某些内容时,您将LinkedListElement<U>
移动到链表的前面。这样,你总是在列表的顶部有最新的元素。插入元素时,将它们同时添加到链表和字典中,并测试是否满足字典大小限制。如果是,则从链表和字典的底部删除元素。
记得锁定!
由于您使用的是托管语言,因此您管理内存的方式受到限制,手动释放内存或强制垃圾收集器这样做的做法都被认为是次优的。
因此,没有直接的方法来说明您的泛型字典允许保留多少元素以及您还可以占用多少内存。同时,从字典中删除一些旧的值不会自动导致可用内存的立即增加。
也就是说,您可以使用GC继续监视当前分配给应用程序的内存。GetTotalMemory(只要你的对象是完全可管理的,例如不包含非托管代码或数据块),并将其与应用程序可用的总系统内存进行比较。
或者,如果您知道放入Dictionary<>
中的对象的大小,您可能会对使用MemoryFailPoint类感兴趣,该类将告诉您是否可以创建给定大小的新对象,这样您就不会遇到OutOfMemory
异常并有时间释放一些资源。
最后,如果你使用字典作为缓存,在ASP中有一些内置的缓存提供程序。NET,从这里阅读。缓存会在内存压力的情况下自动删除过时或旧的对象。