如何在Java 8中并行读取文件的所有行

use*_*001 17 java parallel-processing java-8

我想尽快读取1 GB大文件的所有行Stream<String>.目前我正在使用Files(path).lines()它.在解析文件之后,我正在进行一些计算(map()/ filter())起初我认为这已经是并行完成了,但似乎我错了:当按原样读取文件时,我的双CPU需要大约50秒笔记本电脑.但是,如果我使用bash命令拆分文件然后并行处理它,它只需要大约30秒.

我尝试了以下组合:

  1. 单个文件,没有平行线()流~50秒
  2. 单个文件,Files(..).lines().parallel().[...]约50秒
  3. 两个文件,没有平行线()strean~30秒
  4. 两个文件,Files(..).lines().parallel().[...]约30秒

我使用大致相同的结果(1或2秒)多次运行这4次.它[...]只是一个映射和过滤链,toArray(...)最后用于触发评估.

结论是使用没有区别lines().parallel().由于并行读取两个文件所需的时间较短,因此分割文件会带来性能提升.然而,似乎整个文件是连续读取的.

编辑: 我想指出我使用的是SSD,所以实际上是在寻找时间.该文件总共有1658652(相对较短)的行.在bash中拆分文件大约需要1.5秒: time split -l 829326 file # 829326 = 1658652 / 2 split -l 829326 file 0,14s user 1,41s system 16% cpu 9,560 total

所以我的问题是,Java 8 JDK中是否有任何类或函数可以并行读取所有行而不必先拆分它?例如,如果我有两个CPU内核,则第一行读取器应从第一行开始,第二行应从第一行开始(totalLines/2)+1.

小智 6

你可能会从这篇文章中找到一些帮助.试图并行化文件的实际读取可能是错误的树,因为最大的减速将是你的文件系统(即使在SSD上).

如果你在内存中设置一个文件通道,你应该能够以极快的速度从那里并行处理数据,但你可能不需要它,因为你会看到一个巨大的速度增加.