当前位置:首页 > 内存 > 正文

java读取大文件内存溢出

  • 内存
  • 2024-06-11 14:34:05
  • 6307

一、解决java读取大文件内存溢出问题,如何在不

1传统读入内存

读取文件行的​​标准方法是读入Guava和ApacheCommonsIO内存,如下所示:

这种方法的问题在于,文件的所有行都存储在内存中,当文件足够大时,很快就会导致程序抛出OutOfMemory异常。
例如:读取一个1G左右的文件:

这种方法一开始占用的内存很少:(大约消耗0Mb内存)

但是,当所有文件都读入内存后,我们终于可以看到(大约消耗了2GB内存):

这意味着这个进程消耗大约2.1GB内存-原因很简单:现在文件的所有行都存储在内存中。
将文件的全部内容放入内存中将很快耗尽可用内存-无论实际可用内存有多少,那是清楚的。
而且,我们通常不需要一次将文件的所有行放入内存-相反,我们只需要迭代文件的每一行,进行适当的处​​理,处理后丢弃它。这正是我们要做的-迭代行而不是将所有行保留在内存中。
2流式传输文件
现在让我们看看这个解决方案-我们将使用r类扫描文件的内容并连续逐行读取它:

此方案将迭代文件中的所有行-允许处理每一行而不保留对其的引用。简而言之,它们不会被缓存:(大约消耗150MB内存)

3ApacheCommonsIO流
也可以使用CommonsIO库来实现,该库提供了自定义LineIterator:

由于整个文件没有被缓存,这会导致非常保守的内存消耗:(大约消耗150MB内存)

4结论
这篇短文介绍了如何在不不断读取和耗尽内存的情下处理大文件——这提供了处理大文件的解决方案。


二、java读取大容量文件,内存溢出?怎么按几行读取,读取多次。edReader;
tFoundException;
ader;
ption;
AccessFile;
r;
publicclassTestPrint{
publicstaticvoidmain(String[]args)throwsIOException{
Stringpath="要读取的文件的路径";
RandomAccessFilebr=newRandomAccessFile(path,"rw");//这里的rw由你决定。如果区分大小写,只需写r
Stringstr=null,app=null;
inti=0;
while((str=ne())!=null){
i++;
app=app+str;
if(i>=100){//假设读取了100行
i=0;
//这里运行这些先读100行,然后阅读更多>}