2017-09-04 92 views
0

我想讀一個大的文本文件,大約幾個GB,並對其進行處理,而無需裝載它的整個文件,而是裝載塊的塊。(處理涉及計字實例)使用NIO VS RandomAccessFile的讀取文件

如果我使用併發哈希映射並行處理文件以提高效率,有沒有辦法使用NIO或隨機訪問文件以塊的形式讀取它?它會使它更有效率嗎?

當前實現使用緩衝的讀者是這樣的:

while(lines.size() <= numberOfLines && (line = bufferedReader.readLine()) != null) { 
    lines.add(line); 
} 

lines.parallelStream().. // processing logic using ConcurrentHashMap 
+1

下定決心。這是什麼? NIO?或者'RandomAccessFile'?無論如何,你可以用'BufferedReader'讀取每秒數百萬行。 NIO不會比使用NIO快20%,而使用RandomAccessFile會使速度減慢*,因爲沒有緩衝:多線程可能會導致更糟或者根本不做任何事情,因爲磁盤不是多線程的。你真的需要這樣做嗎? – EJP

+0

我正在考慮更多的性能調整。那麼當前的實施更有效率? – Maddy

+1

我會考慮*少*性能的調整。只需逐行處理文件,並忘記分塊和並行流式傳輸。在我看來,我已經回答了你的最後一個問題。我當然試過。 – EJP

回答

1

RandomAccessFile只有在你打算「跳」在文件中,你對你所做的描述聽起來不像那樣。如果您必須應對大量並行通信,並且您想要執行非阻塞操作,則NIO很有意義。在套接字上。這似乎也不是你的用例。

所以我的建議是堅持在InputStreamReader(FileInputStream)之上使用BufferedReader的簡單方法(不要使用FileReader,因爲它不允許您指定要使用的字符集/編碼)和按照您在示例代碼中顯示的數據瀏覽數據。只有當你看到糟糕的表現時,纔會離開parallelStream,你可以嘗試一下。

永遠記住:不成熟的優化是萬惡之源。

+0

我建議你查看整個報價。你可能會得到一個驚喜。 – EJP

+1

@EJP「編程人員浪費大量時間思考或擔心程序中非關鍵部分的速度,而這些效率方面的嘗試實際上在考慮調試和維護時會產生強烈的負面影響,我們應該忘記小的效率,大約97%的時間:不成熟的優化是萬惡之源,但我們不應該在這個關鍵的3%中放棄我們的機會。「我在這裏沒有看到任何意外,至少我懷疑這個問題屬於提到的3%。 – Lothar

-1

明顯的Java 7的解決方案是:

String lines = Files.readAllLines(Paths.get("file"), StandardCharsets.UTF_8).reduce((a,b)->a+b); 

老實說,我不知道,如果它是快,但我在引擎蓋下它沒有讀到緩衝區,所以至少在理論上它應該更快

+0

你猜對了。請參閱[Javadoc](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#readAllLines-java.nio.file.Path-)。 – EJP