用于在大型数据集中对相同值进行分组的高效解决方案

Ale*_*ets 8 java algorithm bigdata batch-processing spring-batch

在我的工作中,我将为以下问题开发并实施解决方案:

给定来自特定数据集字段的30M记录提取(键,值)元组的数据集,按键和值对它们进行分组,存储每个键的相同值的数量.将每个密钥的前5000个最常见值写入数据库.每个数据集行以序列化XML的形式包含最多100个(键,值)元组.

我想出了这样的解决方案(使用Spring-Batch):

批处理作业步骤:

步骤1.迭代数据集行并提取(键,值)元组.获取一些固定数量的元组后,将它们转储到磁盘上.每个元组都转到名为pattern'/ chunk-'的文件,因此指定键的所有值都存储在一个目录中.在一个文件中存储值已排序.

步骤2.迭代所有''目录并将其块文件合并为一个分组相同的值.由于值是按顺序存储的,因此将它们合并为O(n*log k)复杂度是微不足道的,其中"n"是块文件中的值的数量,"k"是块的初始数量.

步骤3.对于每个合并文件(换句话说,对于每个键),使用PriorityQueue顺序读取其值以保持前5000个值而不将所有值加载到内存中.将队列内容写入数据库.

我花了大约一个星期完成这项任务,主要是因为我以前没有使用过Spring-Batch,因为我试图强调需要精确实现多线程部分的可伸缩性.

问题是我的经理认为这个任务太容易花费那么多时间.

问题是 - 您是否知道更有效的解决方案,或者可能效率更低,更容易实施?您需要多长时间来实施我的解决方案?

我知道类似MapReduce的框架,但是我不能使用它们,因为应用程序应该在一个具有3个核心和1GB用于Java堆的简单PC上运行.

先感谢您!

UPD:我想我没有明确表达我的问题.让我以其他方式问:

鉴于问题并且作为项目经理或者至少任务审核者你会接受我的解决方案吗?你会花多少时间来完成这项任务?

小智 1

您确定这种方法比预扫描 XML 文件以提取所有密钥,然后反复解析 XML 文件中的每个密钥更快吗?您在此解决方案中执行了大量文件管理任务,这绝对不是免费的。

由于您有三个核心,因此您可以同时解析三个密钥(只要文件系统可以处理负载)。