1.传统的内存读取
读取文件行的默认方式是在内存中读取Guava和ApacheCommonsIO都提供了快速读取文件行的方法,如下:
这种方法的问题在于,文件中的所有行都存储在内存中,当文件足够大时,很快就会导致程序抛出OutOfMemoryError异常。
例如:读取大约大小的文件。1G:
该方法一开始只占用很少的内存:(消耗0Mb左右内存)
但是当所有文件都读入内存后,我们终于可以看到(大约消耗了2GB内存):
这意味着这个过程大约使用了2.1GB内存——原因很简单:现在文件中的所有行都存储在内存中。
将文件的全部内容放入内存中会很快耗尽可用内存——无论实际可用内存有多少,这是显而易见的。
此外,我们通常不需要一次将文件的所有行提交到内存中-相反,我们只需要迭代文件的每一行,进行适当的处理,并在处理后丢弃它。因此,这正是我们要做的-迭代而不是将所有行保留在内存中。
2.文件流
现在让我们看看这个解决方案-我们使用r类扫描文件内容并连续逐行读取:
此方案将迭代文件中的所有行-以便可以在不引用它的情况下处理每一行。简而言之,它们不存储在内存中:(大约消耗150MB内存)
3ApacheCommonsIO流
也可以使用CommonsIO-库来实现,它提供了CustomLineIterator:
由于整个文件不存储在内存中,这导致非常保守的内存消耗:(大约消耗150MB内存)
4结论
这篇短文介绍了如何在不重复读取和耗尽内存的情况下处理大文件——这提供了处理大文件的解决方案。
上一篇:华硕x550v内存条安装教程
下一篇:java内存溢出查看