您好我正在编写一个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最新版本进行编译。
答案 0 :(得分:2)
你简单地消耗太多内存。减少它并增加内存限制。
您正在使用LinkedList<Integer>
,每int
代替10
,可能需要50个字节。作为简单的步骤,切换到ArrayList<Integer>
以节省一半。作为更难的步骤,请使用int[]
并根据需要自行调整大小。
使用
启动JVMjava -Xmx8G
当你有8 GB的可用内存时。