当前位置: 首页 > 面试题库 >

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

司空劲
2023-03-14
问题内容

我想将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中是否有任何类或html" target="_blank">函数可以并行读取所有行而不必先拆分它?例如,如果我有两个CPU内核,则第一行读取器应该从第一行开始,第二行应该从line开始(totalLines/2)+1


问题答案:

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

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



 类似资料:
  • 问题内容: 如何通过Java读取文件夹中的所有文件? 问题答案: Java 8提供了Files.walk API。

  • 问题内容: 我希望读取特定文件夹中的所有文本文件。文件名中没有任何通用模式-否则任务会更容易。 如果我也可以处理子文件夹,那将是很好,但是即使是基本的实现也已足够。 我尝试查看先前询问的相关问题,但是没有一个给出我需要的C和Linux特定答案。 编辑 :所以,这是我根据收到的答案写的- 并收到 错误 -pnp @ pnp-laptop:〜/ snort_rules_folder $ ./a.out

  • 我有不同类型的csv文件公司,职务代码,劳动力,我将下降到SFTP和文件将被处理和保存在数据库。我需要比较和验证csv文件的值和DB值,以便正确保存所有的记录。 对于单个文件,我已经按照下面的步骤进行了验证。 null 要验证csv文件和DB值,我需要获取每个文件的csv行计数,我正在将步骤(I)中文件夹中的所有读取文件写入另一个csv文件(名为)。现在问题是“allfiles.csv”有以下内容

  • 问题内容: 在史前时代(Python 1.4)中,我们做到了: 在Python 2.1之后,我们做到了: 在Python 2.3中获得便利的迭代器协议之前,它可以做到: 我看过一些使用更详细的示例: 这是首选的方法吗? [edit]我知道with语句可以确保关闭文件…但是为什么文件对象的迭代器协议中没有包含该语句呢? 问题答案: 偏爱以下原因的确有一个原因: 我们都为CPython的相对确定性的引

  • 问题内容: 我有一个大文件,需要阅读并制作字典。我希望尽快。但是我在python中的代码太慢了。这是显示问题的最小示例。 首先制作一些假数据 现在,这里是一个最小的python代码片段,可以读入它并制作一个字典。 时间: 但是,可以更快地读取整个文件,如下所示: 我的CPU有8个核心,是否可以在python中并行化此程序以加快速度? 一种可能是读取大块输入,然后在不同的非重叠子块上并行运行8个进程

  • 我想有一个以上的regex如下所示,我如何将其添加到flatmap迭代器中,以便在单个流读取期间将该行的所有匹配值列表? 这个问题是从匹配模式和使用Java8 stream将流写入文件中的扩展