我正在尝试在java中读取一个大约3米行的文件(tab或csv文件);还将虚拟机内存添加到-Xmx6g。对于制表符分隔文件,代码可以正常工作400K行,对于csv文件则可以稍微减少。涉及到许多LinkedHashMaps和Vectors,我尝试在每几百行之后使用System.gc()以释放内存和垃圾值。但是,我的代码在400K行后给出以下错误。
线程“main”中的异常java.lang.OutOfMemoryError:Java堆空间
at java.util.Vector.<init>(Vector.java:111)
at java.util.Vector.<init>(Vector.java:124)
at java.util.Vector.<init>(Vector.java:133)
at cleaning.Capture.main(Capture.java:110)
答案 0 :(得分:4)
您尝试加载整个文件从根本上说是命运多..你可以优化你想要的所有,但你只是将上限略微提高。你需要的是消除限制本身。
实际上你需要在内存中同时存在所有内容的可能性非常微小。你可能需要从那些数据计算一些,所以你应该开始计算一种方法来按块进行计算,每次都能丢弃已处理的块。
如果您的数据密切相关,阻止您序列化您的计算,那么正如HovercraftFOE上面提到的那样,合理的追索是将数据传输到数据库并从那里开始工作,索引您需要的所有内容,使其正常化等等。 / p>