Java - 并行读取二进制文件

标签 java multithreading file-io random-access

我有一个包含信息 block 的二进制文件(以后我将它们称为数据包)。每个数据包由固定长度的 header 和可变长度的主体组成。我必须从数据包 header 本身确定正文的长度。我的任务是从文件中读取这些数据包并对它们执行一些操作。目前我正在执行此任务,如下所示:

  • 将文件作为随机访问文件打开并转到特定的起始位置(用户指定的起始位置)。从该位置读取第一个数据包。执行具体操作
  • 然后循环
    • 读取下一个数据包
    • 执行我的操作 这一直持续到我到达文件末尾标记为止。

正如你所猜测的,当文件大小很大时,串行读取每个数据包并处理它是一件耗时的事情。我想以某种方式并行化此操作,即数据包生成操作并将其放入某个阻塞队列中,然后并行地从队列中检索每个数据包并执行我的操作。

有人可以建议我如何并行生成这些数据包吗?

最佳答案

您应该只让一个线程按顺序读取该文件,因为我假设该文件位于单个驱动器中。读取文件受到 IO 速度的限制,因此在 CPU 中并行化它是没有意义的。事实上,非顺序读取实际上会显着降低性能,因为常规硬盘驱动器是为顺序 IO 设计的。对于它读入的每个数据包,它应该将该对象放入线程安全队列中。

现在您可以开始并行处理数据包。创建多个线程并让它们从队列中读取数据包。每个线程都应该完成自己的处理并将其放入某个“已完成”队列中。

一旦 IO 线程完成读入文件,就应该设置一个标志,以便一旦队列为空,工作线程就会停止。

关于Java - 并行读取二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11110310/

相关文章:

java - JMenuBar 在 Mac OS X Lion 上不显示,但在 Win7 上显示

java - 关于友好号码的节目

java - 是否可以在 hashmap 中存储线程对象?

android - 在 Android 上执行文件 I/O - 它属于哪个线程

java - 将包命名为 "foo.bar.import"是个好主意吗?

java - 如何获取当前时间附近的时间 [Android Studio]

c++ - 在多线程程序中使用 exprtk

java - 在 RXJava android 中为线程设置名称

java - 内存不足错误

C++ 循环未按预期创建输出文件