Java 堆大小和内存不足

标签 java memory-management opencsv

我正在尝试用 java 读取大约 3m 行的文件(tab 或 csv 文件);还将虚拟机内存添加到-Xmx6g。该代码对于制表符分隔文件的 400K 行运行良好,而对于 csv 文件则稍少一些。涉及许多 LinkedHashMap 和 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)

最佳答案

您加载整个文件的尝试从根本上来说是不幸的。您可以优化所有您想要的,但您只会将上限推高一点。你需要的是消除限制本身。

您实际上一次需要内存中的全部内容的可能性非常小,可以忽略不计。您可能需要从这些数据中计算一些东西,因此您应该开始找出一种方法来逐 block 进行计算,每次都能够丢弃处理过的 block 。

如果您的数据深度交织在一起,导致您无法序列化计算,那么合理的解决方案是,正如 HovercraftFOE 上面提到的,将数据传输到数据库中并从那里开始工作,对您需要的所有内容建立索引,对其进行规范化等。

关于Java 堆大小和内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19821133/

相关文章:

java - URLConnection getContentLength() 返回负值

c++ - 动态二维字符串数组,其中第二维可以更改

java - 如何读取 opencsv 中的特定 header ?

java - 将每个属性的单个 bean rowise 写入 csv

java - "This method is deprecated as the user should use the Java 5 conventions."这是什么意思?

java - 尝试在没有比较器的情况下添加树集中时,StringBuffer 未给出 ClassCastException

java - 无法在centos R中安装rJava

c++ - 指针或堆对象的二维数组

caching - 请求分页 : Calculating effective memory access time

java - 没有名为 testhibernate0 的 EntityManager 的持久性提供程序