【问题标题】:Getting data from large number of lists and processing it - heap space error从大量列表中获取数据并进行处理 - 堆空间错误
【发布时间】:2014-05-02 04:17:19
【问题描述】:

我的数据在这样的数据结构中:

List <List<Long>> data;

我已经说过数千个这样的列表,每个列表中有 10 到数百个元素。我需要一次处理每个列表并从中创建对象以存储到硬盘上的文件中。 我正在使用循环迭代器,例如:

for(List <Long> chunk : data) {
   process(chunk);
   writeTofile(chunk);
}

但我收到 Java 堆空间的 OutOfMemory 错误。我使用 Eclipse 内存分析器检查了堆,它说由于弱引用导致内存泄漏。此外,process(chunk) 函数是块大小的指数函数。

是为 data.size() 中的每个块创建新的内存空间,还是 data.get(1) 使用的相同空间现在用于 data.get(2)? 有什么帮助可以克服吗? 以下代码在内存利用率方面有什么不同吗?:

List <Long> chunk;
for(chunk : data) {
   process(chunk);
   writeTofile(chunk);
   chunk.clear();
}

在高效垃圾收集方面,数组是否是更好的工具?我已经使用 -Xmx11g 来运行这个程序。请指教。谢谢

【问题讨论】:

  • 您得到的错误必须指向代码中的某个部分。你在那里做什么?

标签: java garbage-collection heap-memory weak-references


【解决方案1】:

看起来chunk 列表在调用process(chunk) 后需要更多空间。看起来您在处理之前为所有 data 提供了足够的内存,但之后却没有。因此,在使用时清除块似乎是正确的解决方案。通常,使用数组而不是集合是一个坏主意:数组是旧的低级东西,主要用作集合的构建块。

如果您有很多非常短的集合,那么切换到数组可能是有利可图的。在处理原语时也是如此。 List&lt;Long&gt; 的内存消耗可能是相同大小的内存消耗long[] 的三倍。通过使用例如,您可以同时拥有集合的舒适性和数组的紧凑性。 trove 原始集合。

【讨论】:

    猜你喜欢
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2012-10-27
    • 2010-12-12
    • 2013-12-18
    • 2016-03-30
    • 1970-01-01
    相关资源
    最近更新 更多