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

我想将1

GB大文件的所有行尽快读取到中Stream<String>。目前,我正在Files(path).lines()为此使用。解析文件后,我要进行一些计算(map()/

filter())。

起初我以为这已经并行完成了,但是似乎我错了:当按原样读取文件时,在我的双CPU笔记本电脑上大约需要50秒钟。但是,如果我使用bash命令拆分文件,然后并行处理它们,则只需要30秒钟。

我尝试了以下组合:

  1. 单个文件,没有并行lines()流〜50秒
  2. 单个文件,Files(..).lines().parallel().[...]约50秒
  3. 两个文件,无平行lines()间隔约30秒
  4. 两个文件,Files(..).lines().parallel().[...]大约30秒

我多次运行这4次,结果大致相同(1或2秒)。的[...]是地图和只有过滤器的链,具有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 8JDK中是否有任何类或函数可以并行读取所有行而不必先拆分它?例如,如果我有两个CPU内核,则第一行读取器应该从第一行开始,第二行应该从line开始(totalLines/2)+1

回答:

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

如果您在内存中设置文件通道,则应该能够从那里并行地并行处理数据,但是您将不需要它,因为您会看到速度大大提高。

以上是 如何在Java 8中并行读取文件的所有行 的全部内容, 来源链接: utcz.com/qa/425801.html

回到顶部