C#中的老化数据结构

时间:2008-08-18 21:44:08

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

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

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

我感兴趣的另一部分是老化旧数据,如果我只是要求不到6小时前的物品数量我想要比那更旧的东西要从我的数据结构中删除,因为这可能是一个长期运行的程序。

3 个答案:

答案 0 :(得分:3)

可以使用简单的链接列表。

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

示例代码:

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

如果列表足够繁忙以保证一次删除大件,那么我同意dmo,使用树结构或类似的东西允许在更高级别进行修剪。

答案 1 :(得分:2)

我认为重要的考虑因素是查询与添加/删除的频率。如果你经常进行查询(特别是如果你有一个大型集合),可以选择B树:

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

你可以让一些线程经过并定期清理这棵树,或者让它成为搜索的一部分(再次,取决于用法)。基本上,您将进行树搜索以找到“x分钟前”的位置,然后用较新的时间计算节点上的子节点数。如果您保持节点下的子节点数最新,则可以快速完成此总和。

答案 2 :(得分:2)

具有滑动过期的缓存可以完成工作....

填充你的物品,缓存处理老化......

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