1

我有大量数据(存储在文件中,但无关紧要 - 主要是数据不适合内存) - 比如说 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#,这个问题是理论上的,而不是“使用以下代码:”)

4

1 回答 1

1

好吧,问题的评论可能被视为答案......
您可以使用mapreducehadoop是 java 中的框架实现),
您的map阶段将解析每一行并为每一行提取相关的键和值。
您的reduce阶段将汇总给定键的所有数据。

于 2011-06-02T14:29:13.033 回答