【发布时间】:2014-06-18 11:36:44
【问题描述】:
我正在设计一个需要非常快的批量数据加载器实用程序。输入是某种格式的一个或多个文件,包含要加载到高性能分布式系统的数据。为简单起见,我们假设只有一个文件,但这个想法应该很容易推广到多个磁盘上的多个输入文件。
我们知道硬盘是串行设备,只有在执行顺序 IO 时才能达到最大性能。后端分布式系统更强大,可以让我同时从多个磁盘加载数据。
我的想法是这样的:
每个文件都有一个生产者线程,它读取 LARGE 块,解析块以识别单个记录,然后将每个记录“重新分区并发送”到其关联的内存容器。重新分区将基于每条记录的一个或多个属性(考虑基于每个人的 ID 重新分区)。
有多个内存容器保存中间记录。每个容器都绑定到一个消费者线程,该线程一次从其容器中获取一条记录,并将其加载到后端系统中。
我的问题是:
如何设计一个函数来“重新分区并发送”每条记录到其关联的内存容器?
如果每个消费者线程对其容器中的一批记录进行排序,然后在一次调用中加载它们会怎样?什么是内存容器的好数据结构?
请分享您的专业知识。如果你能详细说明并提供一些伪代码,那就太棒了!谢谢。
【问题讨论】:
-
缺乏任何相反的证据,假设标准集合可以很好地完成任务。写下来,然后评估性能。 然后决定需要改进的地方(如果有的话)。
标签: java multithreading iostream fork-join