java - 如何在 Java 中重新分区文件中的每一行

标签 java multithreading iostream fork-join

我正在设计一个需要非常快的批量数据加载器实用程序。输入是某种格式的一个或多个文件,包含要加载到高性能分布式系统的数据。为简单起见,我们假设只有一个文件,但这个想法应该很容易推广到多个磁盘上的多个输入文件。

我们知道硬盘是串行设备,只有在顺序IO时才能发挥最大性能。后端分布式系统更强大,可以让我同时从多个磁盘加载数据。

我的想法是这样的:

  1. 每个文件我有一个生产者线程,它读取大块,解析 block 以识别单个记录,然后“重新分区并发送”每条记录到其关联的内存容器。重新分区将基于每条记录的一个或多个属性(考虑根据每个人的 ID 重新分区)。

  2. 有多个内存容器保存中间记录。每个容器都绑定(bind)到一个消费者线程,该线程一次从其容器中获取一条记录,并将其加载到后端系统。

我的问题是:

  • 如何设计一个功能来将每条记录“重新分区并发送”到其关联的内存容器中?

  • 如果每个消费者线程对其容器中的一批记录进行排序,然后在一次调用中加载它们,会怎样?内存容器的良好数据结构是什么?

请分享您的专业知识。如果您能详细说明并提供一些伪代码,那就更棒了!谢谢。

最佳答案

这很像 MapReduce任务。如果您可以将类似 Hadoop 的基础架构安装到您的分布式系统,那么这应该很容易完成。

关于java - 如何在 Java 中重新分区文件中的每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24284509/

相关文章:

c++ - 继承 ostream 和 streambuf 问题与 xsputn 和溢出

java - 从 servlet 调用外部 Web 服务

java - 列出特定文件夹的媒体文件图像和视频

java - 如何防止 session 属性在服务器上持久化?

c# - 这个算法线程安全吗?

c++ - 将 double 指数的可移植打印到 C++ iostreams

c++ - STL 中没有 basic_ostream 的 writesome 函数的理由是什么?

java - Netbeans 输出是否存储在文件中?

java - Android Instrumentation 测试 - UI 线程问题

c++ - 我如何创建一个线程安全的 QOffscreenSurface 供 OpenGl 使用