Language agnostic 海量数据集的快速分组和聚合

Language agnostic 海量数据集的快速分组和聚合,language-agnostic,grouping,aggregation,large-data,Language Agnostic,Grouping,Aggregation,Large Data,我有大量的数据存储在文件中,但这是不相关的-主要部分是数据不适合存储在内存中-比如说109行记录 记录由时间、一些键集和数据组成。钥匙不是唯一的。 比如说 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 ... 我需要遍历所有的数据,并

我有大量的数据存储在文件中,但这是不相关的-主要部分是数据不适合存储在内存中-比如说109行记录

记录由时间、一些键集和数据组成。钥匙不是唯一的。 比如说

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
我使用朴素的解决方案实现了这一点,我有字典,还有总结。但问题是,A,C的独特组合可能比我记忆中所能容纳的还要多

我不能对任何数据进行预求和,因为可能会出现任何筛选,也不能使用SQL关系数据库,因为它不适合我

有没有内存效率高的算法可以用这种方式分组?SQL是如何处理这么多数据的?我能够在SQL上进行分组,但我不想使用它的原因有很多

或者,我应该用谷歌搜索什么?我还没有找到任何关于这个问题的有用文章


我用的是C,这个问题是理论性的,而不是“使用下面的代码:”

好吧,这个问题的注释可能会被认为是一个答案。。。 您可以使用java中的框架实现 映射阶段将解析每一行,并提取每一行的相关键和值。
您的reduce阶段将总结给定键的所有数据。

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

您考虑过使用mapreduce吗?它看起来非常合适@埃米特:不,我从没听说过。谢谢你的链接,我来看看。mapreduce是一个用于将数据切割成块的框架,首先将数据映射成两个对:键、值,然后给出每个键的值列表,将reduce步骤作为总结。它最初是用C++实现的,但是Hadoop是java版本,我假设C版本也是可用的。祝你好运你为什么不想使用数据库?@ypercube>我没有说我不想使用数据库-我不想使用SQL。你考虑过使用mapreduce吗?它看起来非常合适@埃米特:不,我从没听说过。谢谢你的链接,我来看看。mapreduce是一个用于将数据切割成块的框架,首先将数据映射成两个对:键、值,然后给出每个键的值列表,将reduce步骤作为总结。它最初是用C++实现的,但是Hadoop是java版本,我假设C版本也是可用的。祝你好运你为什么不想使用数据库?@ypercube>我没有说我不想使用数据库-我不想使用SQL。事实上,我尝试过使用这种方法,只是不知道它叫map/reduce。问题是,即使在应用任何“仅获取前5名”之前进行最终缩减,数据集仍然相当庞大。我可以将其划分为更小的组,并从中选择“top5”,但这可能会返回错误的数据。甚至可能有10^9行具有唯一键-我无法检测到这一点如果您使用现有库,map/reduce框架应该为您处理它。此外,只要您的数据小于2^system_位,即使数据不适合RAM,操作系统也会通过将数据交换到磁盘来处理数据,所以实际上,64位系统不会遇到这个问题。事实上,我尝试过使用这种方法,我只是不知道它被称为map/reduce。问题是,即使在应用任何“仅获取前5名”之前进行最终缩减,数据集仍然相当庞大。我可以将其划分为更小的组,并从中选择“top5”,但这可能会返回错误的数据。甚至可能有10^9行具有唯一键-我无法检测到这一点如果您使用现有库,map/reduce框架应该为您处理它。此外,只要您的数据小于2^system_位,即使数据不适合RAM,操作系统也会通过将数据交换到磁盘来处理数据,因此实际上,64位系统不会面临此问题。