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. docker-compose 为何找不到配置文件?2. python的bs4如何筛选出h1标签中的内容3. angular.js - 通过数据中children的个数自动生成能点击展开的div4. css - 使用blur()滤镜为什么有透明的效果5. docker gitlab 如何git clone?6. android - 安卓做前端,PHP做后台服务器 有什么需要注意的?7. 前端 - css3 3d效果问题8. java - spring-data Jpa 不需要执行save 语句,Set字段就可以自动执行保存的方法?求解9. javascript - 移动端H5页面禁止缩放了,在浏览器上仍然可以缩放10. javascript - JS设置Video视频对象的currentTime时出现了问题,IE,Edge,火狐,都可以设置,反而chrom却...
