我的工作是为以下问题开发和实施解决方案:
给定一个包含 30M 记录的数据集,从特定数据集字段中提取(键,值)元组,按键和值对它们进行分组,存储每个键的相同值的数量。将每个键的前 5000 个最常见的值写入数据库。每个数据集行包含多达 100 个(键、值)元组,采用序列化 XML 的形式。
我想出了这样的解决方案(使用Spring-Batch):
批处理作业步骤:
步骤 1.遍历数据集行并提取(键、值)元组。在获得一些固定数量的元组后,将它们转储到磁盘上。每个元组都转到一个名称模式为“/chunk-”的文件,因此指定键的所有值都存储在一个目录中。在一个文件中,值是按顺序存储的。
步骤 2.遍历所有 '' 目录并将它们的块文件合并为一个分组相同的值。由于这些值是按顺序存储的,因此对于 O(n * log k) 复杂度而言,将它们合并是微不足道的,其中“n”是块文件中的值的数量,“k”是块的初始数量。
步骤 3.对于每个合并文件(即每个键),使用PriorityQueue顺序读取其值以维护前 5000 个值,而不将所有值加载到内存中。将队列内容写入数据库。
我在这个任务上花了大约一周的时间,主要是因为我以前没有使用过 Spring-Batch,并且因为我试图强调需要准确实现多线程部分的可伸缩性。
问题是我的经理认为这项任务太容易了,无法在上面花费那么多时间。
问题是 -您是否知道更有效的解决方案,或者可能更容易实施的效率较低?您需要多少时间来实施我的解决方案?
我知道类似 MapReduce 的框架,但我不能使用它们,因为该应用程序应该在具有 3 个内核和 1GB 用于 Java 堆的简单 PC 上运行。
先感谢您!
UPD:我想我没有清楚地表达我的问题。让我换个方式问:
鉴于问题并作为项目经理或至少是任务审阅者,您会接受我的解决方案吗?你会花多少时间来完成这项任务?