【问题标题】:Aging Data Structure in C#C# 中的老化数据结构
【发布时间】:2010-09-06 03:04:55
【问题描述】:

我想要一个允许查询过去 X 分钟内有多少项目的数据结构。一个项目可能只是一个简单的标识符或更复杂的数据结构,最好项目的时间戳将在项目中,而不是存储在外部(作为散列或类似的,不希望有多个项目具有相同的问题时间戳)。

到目前为止,我似乎可以使用 LINQ 轻松过滤时间戳大于给定时间的项目并聚合计数。尽管我对尝试将 .NET 3.5 特定的东西应用到我的生产环境中犹豫不决。对于类似的数据结构,还有其他建议吗?

我感兴趣的另一部分是老化旧数据,如果我只想询问少于 6 小时前的项目计数,我想要比这更旧的任何数据从我的数据结构中删除,因为这可能是一个长时间运行的程序。

【问题讨论】:

    标签: c# linq .net-3.5 data-structures


    【解决方案1】:

    可以使用一个简单的链表。

    基本上你在末尾添加新项目,从一开始就删除太旧的项目,这是一种廉价的数据结构。

    示例代码:

    list.push_end(new_data)
    while list.head.age >= age_limit:
        list.pop_head()
    

    如果列表足够繁忙以至于需要一次切掉大于一个的部分,那么我同意dmo,使用树结构或允许更高级别修剪的类似结构。

    【讨论】:

      【解决方案2】:

      我认为一个重要的考虑因素是查询与添加/删除的频率。如果您要进行频繁的查询(特别是如果您有大量的集合),那么 B 树可能是您的最佳选择:

      http://en.wikipedia.org/wiki/B-tree

      您可以让一些线程通过并定期清理此树或使其成为搜索的一部分(同样,取决于使用情况)。基本上,您将进行树搜索以找到“x 分钟前”的位置,然后计算节点上具有较新时间的子节点数。如果你保持节点下的子节点数量是最新的,这个总和可以很快完成。

      【讨论】:

        【解决方案3】:

        具有滑动过期的缓存将完成这项工作....

        把你的物品塞进去,缓存处理老化....

        http://www.sharedcache.com/cms/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-02
          • 1970-01-01
          • 2011-06-20
          • 2010-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-20
          相关资源
          最近更新 更多