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

如题所述

1、传统的在内存中读取

读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:

这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常。
例如:读取一个大约1G的文件:

这种方式开始时只占用很少的内存:(大约消耗了0Mb内存)

然而,当文件全部读到内存中后,我们最后可以看到(大约消耗了2GB内存):

这意味这一过程大约耗费了2.1GB的内存——原因很简单:现在文件的所有行都被存储在内存中。
把文件所有的内容都放在内存中很快会耗尽可用内存——不论实际可用内存有多大,这点是显而易见的。
此外,我们通常不需要把文件的所有行一次性地放入内存中——相反,我们只需要遍历文件的每一行,然后做相应的处理,处理完之后把它扔掉。所以,这正是我们将要做的——通过行迭代,而不是把所有行都放在内存中。
2、文件流
现在让我们看下这种解决方案——我们将使用Java.util.Scanner类扫描文件的内容,一行一行连续地读取:

这种方案将会遍历文件中的所有行——允许对每一行进行处理,而不保持对它的引用。总之没有把它们存放在内存中:(大约消耗了150MB内存)

3、Apache Commons IO流
同样也可以使用Commons IO库实现,利用该库提供的自定义LineIterator:

由于整个文件不是全部存放在内存中,这也就导致相当保守的内存消耗:(大约消耗了150MB内存)

4、结论
这篇短文介绍了如何在不重复读取与不耗尽内存的情况下处理大文件——这为大文件的处理提供了一个有用的解决办法。

温馨提示:内容为网友见解,仅供参考
无其他回答

解决java读取大文件内存溢出问题,如何在不
2、文件流现在让我们看下这种解决方案——我们将使用Java.util.Scanner类扫描文件的内容,一行一行连续地读取:这种方案将会遍历文件中的所有行——允许对每一行进行处理,而不保持对它的引用。总之没有把它们存放在内存中:(大约消耗了150MB内存)3、Apache Commons IO流同样也可以使用Commons IO库实现,...

如何在Java中读取超过内存大小的文件
最初的方法可能会将所有数据加载到内存中,导致内存溢出错误。因此,改进策略为逐行处理文件并使用哈希数据结构存储数据,以节省内存。分析Counter类和allDaysSet方法展示了如何利用Java处理大文件而无需加载整个文件到内存中。Files类提供逐行处理文件的方法,使得在文件操作过程中利用哈希存储数据成为可能。通过...

读取大量数据时数据时内存溢出怎样分批读取该怎么处理
是的,这个问题我们值得去思考下,通过API发现可以对SQL进行一些操作,例如,通过:PreparedStatementstatement=connection.prepareStatement(sql),这是默认得到的预编译,还可以通过设置: PreparedStatementstatement=connection.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY); 来设置游标的方式,以至于...

java excel poi 大数据量50W 内存溢出
3,调大虚拟机内存大小。

java线程池 读写10万行文件进行遍历时,占用物理内存溢出
先优化下程序吧。你的每个8万行的list,读取完第一个文件,在读取第二个文件的时候释放吗?你“将这个list跟3万行的list 遍历通过相同的id获取3万行里的手机号码。”这个效率太低了,将3万行数据的list改为HashMap,key是id,value是手机号。

...下载大文件的时候报错,内存溢出,能看看是哪的问题么?
不能一次读取完,大文件很容易内存溢出。参考下:public static void download(String path, HttpServletResponse response) throws Exception { try { File file = new File(path); if (file.exists()) { String filename = file.getName(); InputStream fis = new BufferedInputStre...

java.lang.OutOfMemoryError: Java heap space
Java的堆内存溢出了,可能是由于你的某个方法BUG导致的,比如构造了一个List,一次放入的数据过多,或者一次读取某个很大的文件,而没有使用缓存 根本的解决方法是查找导致溢出的方法,并修正(可以减少放入内存的内容)另外有一个治标的方法:在WEB容器启动时加上内存参数:-Xms512m -Xmx512m ...

运行软件说内存溢出是什么意思?
3. **文件版本问题**:特定类型的文件(如旧版本的MDB文件)可能包含不兼容或过于复杂的数据结构,导致在读取或处理这些文件时程序消耗大量内存。更新到最新版本的文件或使用兼容工具处理文件可能有助于解决此问题。解决内存溢出问题的步骤包括:1. **分析代码**:仔细检查程序中的循环、递归调用、内存...

java编译中出现了Exception in thread “main" java.lang.UnsupportedClas...
1、解决措施就是保证jvm(java命令)和jdk(javac命令)版本一致。如果是linux版本,则在命令行中分别输入java -version和javac -version命令来查看版本是否一致。这里假设都是1.7版本。2、如果都一致,但还是解决不了问题,那么你肯定不是直接在命令行中用javac来编译的,而是用类似于eclipse、netbeans...

VS2010读取大文件的时候,内存溢出了,大文件大概700多M,内存是4G的,不...
==# 难道你是想一次性把文件全部加载到内存的?一般都是设置一个缓冲区,缓冲区多大,就加载多少数据,然后要加载后面的数据时,再从当前位置继续读。

相似回答