java - 讀取大于內(nèi)存的大文件怎么讀?
問題描述
參考: 有一個(gè)1G大小的一個(gè)文件,內(nèi)存限制大小是10M,有序返回頻數(shù)最高的50個(gè)詞,該怎么做?
網(wǎng)上有很多該問題的解決方案,都是用分而治之的思想,提到了遍歷整個(gè)文件。
那么我的問題是:如果單純地逐行讀取大文件,算是把1G文件全都加載進(jìn)內(nèi)存嗎?或者說是讀取大于內(nèi)存的文件應(yīng)該怎么讀?
問題解答
回答1:在這里內(nèi)存就像一條管道,逐行讀是把1G文件在內(nèi)存里過一遍而已,10M表示管道的粗細(xì)。所以,逐行讀是把1G文件加載進(jìn)去過內(nèi)存。
回答2:try (BufferedReader in = new BufferedReader(new FileReader(file))) { String line; while ((line = in.readLine()) != null) {// parse line }}
file再大,只要每一行的長度有限,整個(gè)文件讀完會(huì)需要不少的時(shí)間,但不會(huì)占用太大的內(nèi)存。
回答3:分塊讀,每讀一個(gè)塊一個(gè)結(jié)果集,最后對結(jié)果集聚合處理文本的話,知道行數(shù)會(huì)更好
回答4:linux上面有個(gè)指令叫做split可以并發(fā)快速把大文本分割成小的文件,然后處理就方便了呀,這種算法叫做外排序
回答5:內(nèi)存就好比草稿紙,寫滿一篇就翻篇。 用過、沒用的數(shù)據(jù)就扔掉了。
簡單舉例,創(chuàng)建一個(gè)變量 buff,設(shè)定好它的大小,打開文件流往里填,填滿以后查你要的內(nèi)容,查到就統(tǒng)計(jì)到另外一個(gè)變量里計(jì)數(shù)。 然后清空buff,繼續(xù)之前讀取的位置再次裝載內(nèi)容…… 直到讀取完畢,統(tǒng)計(jì)也就完成了。
回答6:針對不同的系統(tǒng),都會(huì)提供一個(gè)API來操作大于內(nèi)存的文件,也就是將文件當(dāng)做內(nèi)存來處理:
內(nèi)存映射
mmap
CreateFileMapping
相關(guān)文章:
1. 怎么在phpstudy中用phpexcel上傳數(shù)據(jù)到MYSQL?2. javascript - 百度搜索網(wǎng)站,如何讓搜索結(jié)果顯示一張圖片加上一段描述,如圖;求教3. phpadmin的數(shù)據(jù)庫,可以設(shè)置自動(dòng)變化時(shí)間的變量嗎?就是不需要接收時(shí)間數(shù)據(jù),自動(dòng)變化4. html5和Flash對抗是什么情況?5. 求救一下,用新版的phpstudy,數(shù)據(jù)庫過段時(shí)間會(huì)消失是什么情況?6. javascript - win7 npm安裝gulp失敗,已是管理員打開,也設(shè)置了文件權(quán)限7. html - 爬蟲時(shí)出現(xiàn)“DNS lookup failed”,打開網(wǎng)頁卻沒問題,這是什么情況?8. boot2docker無法啟動(dòng)9. mac里的docker如何命令行開啟呢?10. 這是什么情況???
