我有大量数据(存储在文件中,但无关紧要 - 主要是数据不适合内存) - 比如说 10 9行记录。
记录由时间、一组键和数据组成。键不是唯一的。
例如
keys: data:
A | B | C |
----------------------
1 | 2 | 3 | 10
1 | 1 | 3 | 150
1 | 1 | 2 | 140
1 | 2 | 5 | 130
5 | 3 | 2 | 120
...
我需要遍历所有数据,并使用用户定义的过滤器对其进行过滤(这不是问题),然后聚合、计算总和并返回具有最高数据的行。
例如,在给定的数据中,我想按 A 和 C 对每个数据分组求和。
预期结果:
A | C | data
------------
1 | 3 | 160
1 | 2 | 140
1 | 5 | 130
------------ following (data isn't in 3 highest value) doesn't concern me.
5 | 2 | 120
我使用幼稚的解决方案实现了这一点,我有Dictionary<tuple(A, C), long>
,并且在那里求和。但问题是,A、C 的独特组合可能比我记忆中的要多。
我不能预先对任何数据求和,因为可能会出现任何过滤,也不能使用 SQL(关系数据库不适合我)。
是否有任何可用于以这种方式分组的内存高效算法?SQL 是如何处理这么多数据的?我可以在 SQL 上进行分组,但有一些原因我不想使用它。
或者,我应该谷歌什么?我还没有找到任何关于这个问题的有用文章。
(我使用的是 C#,这个问题是理论上的,而不是“使用以下代码:”)