Java - 并行读取二进制文件

Suj*_*jay 2 java file-io multithreading random-access

我有一个包含信息块的二进制文件(我将其称为数据包).每个数据包由一个固定长度的头和一个可变长度的主体组成.我要从包头本身确定身体的长度.我的任务是从文件中读取这些数据包并对它们执行一些操作.目前我正在执行以下任务:

  • 将文件作为随机访问文件打开并转到特定的开始位置(用户指定的起始位置).从这个位置读取第一个数据包.执行特定操作
  • 然后在循环中
    • 读下一个包
    • 执行我的操作这一直持续到文件标记结束.

你可以猜到,当文件大小很大时,连续读取每个数据包并处理它是一件非常耗时的事情.我想以某种方式并行化这个操作,即数据包生成操作,并将其放入一些阻塞队列,然后从队列中并行检索每个数据包并执行我的操作.

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

tsk*_*zzy 5

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

现在您可以开始并行处理数据包了.创建多个线程并让它们分别读入队列中的数据包.每个线程都应该进行处理并将其放入一些"已完成"的队列中.

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