3

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

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

我感兴趣的另一部分是老化旧数据,如果我只要求不到 6 小时前的项目计数,我希望从我的数据结构中删除任何比这更旧的数据,因为这可能成为一个长期运行的程序。

4

3 回答 3

3

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

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

示例代码:

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

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

于 2008-08-19T08:53:14.697 回答
2

我认为一个重要的考虑因素是查询与添加/删除的频率。如果您将进行频繁查询(尤其是如果您有大量集合),则 B-tree 可能是要走的路:

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

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

于 2008-08-18T22:25:35.200 回答
2

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

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

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

于 2010-04-23T15:32:59.280 回答