我正在尝试在java中读取大约3m行的文件(选项卡或csv文件);还将虚拟机内存添加到-Xmx6g。该代码适用于制表符分隔文件的 400K 行,而对于 csv 文件略少。涉及许多 LinkedHashMaps 和 Vector,我尝试在每几百行之后使用 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)
您尝试加载整个文件从根本上说是命运多舛的。你可以优化你想要的一切,但你只会把上限推得稍微高一点。你需要的是消除限制本身。
您实际上需要一次将所有内容全部放在内存中的可能性可以忽略不计。您可能需要从该数据中计算一些内容,因此您应该开始研究一种方法来逐块进行计算,每次都能够丢弃已处理的块。
如果你的数据深深地交织在一起,阻止你序列化你的计算,那么合理的办法是,正如HovercraftFOE上面提到的,将数据传输到数据库中并从那里工作,索引你需要的一切,规范化它,等等。