84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
参考: 有一个1G大小的一个文件,内存限制大小是10M,有序返回频数最高的50个词,该怎么做?
网上有很多该问题的解决方案,都是用分而治之的思想,提到了遍历整个文件。
那么我的问题是:如果单纯地逐行读取大文件,算是把1G文件全都加载进内存吗?或者说是读取大于内存的文件应该怎么读?
认证0级讲师
在这里内存就像一条管道,逐行读是把1G文件在内存里过一遍而已,10M表示管道的粗细。所以,逐行读是把1G文件加载进去过内存。
加载进去过
try (BufferedReader in = new BufferedReader(new FileReader(file))) { String line; while ((line = in.readLine()) != null) { // parse line } }
file再大,只要每一行的长度有限,整个文件读完会需要不少的时间,但不会占用太大的内存。
分块读,每读一个块一个结果集,最后对结果集聚合处理文本的话,知道行数会更好
linux上面有个指令叫做split可以并发快速把大文本分割成小的文件,然后处理就方便了呀,这种算法叫做外排序
linux
split
内存就好比草稿纸,写满一篇就翻篇。 用过、没用的数据就扔掉了。
简单举例,创建一个变量 buff,设定好它的大小,打开文件流往里填,填满以后查你要的内容,查到就统计到另外一个变量里计数。 然后清空buff,继续之前读取的位置再次装载内容…… 直到读取完毕,统计也就完成了。
针对不同的系统,都会提供一个API来操作大于内存的文件,也就是将文件当做内存来处理:
内存映射
mmap
CreateFileMapping
在这里内存就像一条管道,逐行读是把1G文件在内存里过一遍而已,10M表示管道的粗细。
所以,逐行读是把1G文件
加载进去过
内存。file再大,只要每一行的长度有限,整个文件读完会需要不少的时间,但不会占用太大的内存。
分块读,每读一个块一个结果集,最后对结果集聚合
处理文本的话,知道行数会更好
linux
上面有个指令叫做split
可以并发快速把大文本分割成小的文件,然后处理就方便了呀,这种算法叫做外排序内存就好比草稿纸,写满一篇就翻篇。 用过、没用的数据就扔掉了。
简单举例,创建一个变量 buff,设定好它的大小,打开文件流往里填,填满以后查你要的内容,查到就统计到另外一个变量里计数。 然后清空buff,继续之前读取的位置再次装载内容…… 直到读取完毕,统计也就完成了。
针对不同的系统,都会提供一个API来操作大于内存的文件,也就是将文件当做内存来处理:
内存映射
mmap
CreateFileMapping