簡體   English   中英

使用NIO與RandomAccessFile讀取文件塊

[英]Using NIO vs RandomAccessFile to read chunks of files

我想讀取一個大約幾個GB的大文本文件,然后在不加載整個文件但又加載大塊文件的情況下對其進行處理。(處理過程涉及對單詞實例進行計數)

如果我正在使用並發哈希映射來並行處理文件以提高效率,是否可以使用NIO或隨機訪問文件來分塊讀取文件? 它會提高效率嗎?

當前的實現使用的是一個緩沖的讀取器,它的內容如下:

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

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

僅當您打算在文件內“跳轉”並且您對正在執行的操作的描述聽起來不像那樣時, RandomAccessFile才有意義。 如果您必須處理大量並行通信,並且想要執行非阻塞操作(例如在Socket上),則NIO很有意義。 那似乎也不是您的用例。

因此,我的建議是堅持使用在InputStreamReader(FileInputStream)之上使用BufferedReader的簡單方法(不要使用FileReader,因為這不允許您指定要使用的字符集/編碼)並遍歷數據如您在示例代碼中所示。 放棄parallelStream,只有在看到性能不佳時才可以嘗試一下。

永遠記住:過早的優化是萬惡之源。

顯而易見的Java 7解決方案是:

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

老實說,我不知道它是否更快,但是我猜測它沒有將其讀入緩沖區,所以至少在理論上應該更快

暫無
暫無

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

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