[英]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.