0

我正在尝试在 java 中读取大约 3m 行的文件(选项卡或 csv 文件);还将虚拟机内存添加到-Xmx6g。该代码适用于制表符分隔文件的 400K 行,而 csv 文件的行数则略少。涉及到许多 LinkedHashMap 和向量,我尝试在每几百行之后使用 System.gc() 以释放内存和垃圾值。但是,我的代码在 400K 行之后给出了以下错误。

线程“主”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)
4

1 回答 1

4

您尝试加载整个文件基本上是命运多舛。你可以优化所有你想要的,但你只是将上限推高一点。您需要的是消除限制本身。

您实际上一次需要内存中的全部内容的可能性非常小。您可能需要该数据中计算一些东西,因此您应该开始想办法逐块进行计算,每次都能够丢弃处理过的块。

如果您的数据深深交织在一起,阻止您对计算进行序列化,那么合理的办法是,正如上面提到的 HovercraftFOE,将数据传输到数据库并从那里工作,索引您需要的所有内容,对其进行规范化等。

于 2013-11-06T19:40:47.477 回答