我有一个很大的dataset
,可能有超过一百万个条目。所有项目都有一个指定的时间戳,并且项目在运行时添加到集合中(通常但不总是使用较新的时间戳)。
我需要在给定的时间范围内显示该数据的子集。与总数据集相比,该时间范围通常非常小,即在该给定时间范围内不超过约1000的1.000.000+项目。该时间范围以恒定的速度移动,例如,每秒钟的时间范围都会移动一秒钟。
此外,用户可以随时调整时间范围(“移动”数据集)或设置其他过滤器(例如按某些文本过滤)。
到目前为止,我并不担心性能,试图让其他事情正确,只能使用较小的测试集。我不太确定如何有效地解决这个问题,并且很乐意为每一个输入。感谢。
编辑:使用的语言是C#4。
更新:我现在使用的是间隔树,可以在这里找到实现: https://github.com/mbuchetics/RangeTree
它还带有一个异步版本,它使用任务并行库(TPL)重建树。
答案 0 :(得分:3)
我们在开发过程中遇到了类似的问题 - 必须收集按某些键排序的数百万个项目,然后根据需要导出一个页面。我看到你的问题有点类似。
为此目的,我们通过以下方式调整了red-black tree结构:
RB Tree具有O(log n)插入复杂度,所以我猜你的插入很适合。
迭代器上的 next()
是通过添加和维护所有叶节点的链表来实现的 - 我们最初采用的RB Tree实现不包括这个。
RB Tree也很酷,因为它允许您根据需要微调节点大小。通过试验,您将能够找到适合您问题的正确数字。
答案 1 :(得分:1)
使用按时间戳排序的SortedList。
所有你需要的是在排序列表中的排序键上实现二进制搜索,以找到选择的边界,这很容易。
答案 2 :(得分:0)
将新项目插入已排序的列表中。这样可以让您轻松选择范围。如果你熟悉它,你也可以使用linq。