java - 讀取大于內存的大文件怎么讀?
問題描述
參考: 有一個1G大小的一個文件,內存限制大小是10M,有序返回頻數最高的50個詞,該怎么做?
網上有很多該問題的解決方案,都是用分而治之的思想,提到了遍歷整個文件。
那么我的問題是:如果單純地逐行讀取大文件,算是把1G文件全都加載進內存嗎?或者說是讀取大于內存的文件應該怎么讀?
問題解答
回答1:在這里內存就像一條管道,逐行讀是把1G文件在內存里過一遍而已,10M表示管道的粗細。所以,逐行讀是把1G文件加載進去過內存。
回答2:try (BufferedReader in = new BufferedReader(new FileReader(file))) { String line; while ((line = in.readLine()) != null) {// parse line }}
file再大,只要每一行的長度有限,整個文件讀完會需要不少的時間,但不會占用太大的內存。
回答3:分塊讀,每讀一個塊一個結果集,最后對結果集聚合處理文本的話,知道行數會更好
回答4:linux上面有個指令叫做split可以并發快速把大文本分割成小的文件,然后處理就方便了呀,這種算法叫做外排序
回答5:內存就好比草稿紙,寫滿一篇就翻篇。 用過、沒用的數據就扔掉了。
簡單舉例,創建一個變量 buff,設定好它的大小,打開文件流往里填,填滿以后查你要的內容,查到就統計到另外一個變量里計數。 然后清空buff,繼續之前讀取的位置再次裝載內容…… 直到讀取完畢,統計也就完成了。
回答6:針對不同的系統,都會提供一個API來操作大于內存的文件,也就是將文件當做內存來處理:
內存映射
mmap
CreateFileMapping
相關文章:
1. mysql 查詢身份證號字段值有效的數據2. python - 爬蟲模擬登錄后,爬取csdn后臺文章列表遇到的問題3. mysql - 把一個表中的數據count更新到另一個表里?4. javascript - 彈出一個子窗口,操作之后關閉,主窗口會得到相應的響應,例如網站的某些登錄界面,django后臺的管理等,這是怎么實現的呢?5. 視頻文件不能播放,怎么辦?6. 請教使用PDO連接MSSQL數據庫插入是亂碼問題?7. mysql - 分庫分表、分區、讀寫分離 這些都是用在什么場景下 ,會帶來哪些效率或者其他方面的好處8. python bottle跑起來以后,定時執行的任務為什么每次都重復(多)執行一次?9. android - 分享到微信,如何快速轉換成字節數組10. visual-studio - Python OpenCV: 奇怪的自動補全問題
