1

嗨,我正在编写一个 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 最新版本进行编译。

4

1 回答 1

2

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

减少内存

您正在使用LinkedList<Integer>它可能需要 50 个字节int而不是10. 作为简单的步骤,切换ArrayList<Integer>到保存一半。作为更难的一步,int[]根据需要自行使用和调整它们的大小。

增加你的内存限制

启动你的JVM

java -Xmx8G

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

于 2013-10-29T02:13:33.433 回答