我希望在Java中创建一个非常大的图(大约有1000万个边)。我计划使用
当向图添加了约100万条边后,以下代码会抛出
List<List<Integer>>
来描述边,其中内部List<Integer>
描述每条边的两个顶点(顶点类型是整数)。当向图添加了约100万条边后,以下代码会抛出
OutOfMemoryError
异常。(出于讨论的简洁,我简化了如何生成边的过程。)public static void main(String[] args) {
List<List<Integer>> graph = new ArrayList<List<Integer>>();
for (int i = 0; i < 10000000; i++) {
List<Integer> edge = new ArrayList<Integer>();
// the real edges are more complicated (than from vertex i to vertex i+1)
// this is simplified for the sake of the discussion here
edge.add(i);
edge.add(i+1);
graph.add(edge);
}
}
我搜索了OutOfMemoryError
,并将Eclipse的初始堆大小增加到2G:-Xms2g -Xmx4g -Xss2m
(传递给JVM)。但这并没有解决问题。
然后我想也许我应该垃圾回收List<Integer> edge
变量,通过调用System.gc()
,以防其内存未被清除。但这也没有起作用。
我在想问题可能出在List<List<Integer>>
数据结构上。我尝试使用List<int[]>
,持续时间更长:在发生OutOfMemoryError
之前添加了更多的边缘。我现在没有更好的想法。
我搜索了类似的问题,但没有找到太多帮助。我想知道是否有人遇到过这种情况。