【问题标题】:How to clean dictionary by deleting old elements from it如何通过删除旧元素来清理字典
【发布时间】:2013-06-15 19:21:20
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net .net asp.net-mvc dictionary


    【解决方案1】:

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

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

    引用:

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

    【讨论】:

    【解决方案2】:

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

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

    记住锁定!

    【讨论】:

      【解决方案3】:

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

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

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

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

      最后,如果您使用字典作为缓存,ASP.NET 中有一些内置的缓存提供程序,请阅读from here。缓存会自动丢弃过时或旧的对象以防内存压力。

      【讨论】:

        猜你喜欢
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-10
        • 2021-12-31
        • 1970-01-01
        相关资源
        最近更新 更多