簡體   English   中英

如何在 Java 8 中並行讀取文件的所有行

[英]How to read all lines of a file in parallel in 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 秒

我多次運行這 4 次,結果大致相同(1 或 2 秒)。 [...]只是一個 map 和 filter 鏈,最后有一個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

您可能會從這篇文章中找到一些幫助。 嘗試並行化文件的實際讀取可能會導致錯誤的樹,因為最大的減速將是您的文件系統(即使在 SSD 上)。

如果您在內存中設置文件通道,您應該能夠從那里以極快的速度並行處理數據,但您可能不需要它,因為您會看到速度大大提高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM