加载大文件时超出GC开销限制

时间:2013-10-29 01:41:39

标签: java graph garbage-collection bigdata

您好我正在编写一个java程序来将2G文件加载到内存中,该数据的格式为:

node_number: edge_point_1 edge_point_2 ... edge_point_k

我希望将它作为邻接列表导入内存,但我得到垃圾收集器超出错误。

我注意到文件已加载到内存中,但问题在于制作链表。这是我的代码:

while ((line = reader.readLine()) != null) {
    Integer n1 = line.indexOf(":"), n2;
    Integer k = Integer.parseInt(line.substring(0, n1));
    n1 = n1 + 2;
    lists[k] = new LinkedList<Integer>();
    do {
        n2 = line.indexOf(" ", n1);
        if (n2 == -1)
            lists[k].add(Integer.parseInt(line.substring(n1, line.length())));
        else
            lists[k].add(Integer.parseInt(line.substring(n1, n2)));
        n1 = n2 + 1;
    } while (n2 != -1);
}

有人知道我的代码有什么问题吗?我正在使用Netbeans最新版本进行编译。

1 个答案:

答案 0 :(得分:2)

你简单地消耗太多内存。减少它并增加内存限制。

减少内存

您正在使用LinkedList<Integer>,每int代替10,可能需要50个字节。作为简单的步骤,切换到ArrayList<Integer>以节省一半。作为更难的步骤,请使用int[]并根据需要自行调整大小。

增加内存限制

使用

启动JVM
java -Xmx8G

当你有8 GB的可用内存时。