我想逐行读取我的.csv文件,以防止我自己将所有内容一次加载到RAM中。我认为这是做到这一点的方法。我还以一种方式编写代码,在循环中没有声明变量来保存JVM始终创建新对象并运行垃圾收集器。
然而,我一直在遇到这种情况" GC开销有限超出"错误。我的CPU也运行近100%。
Here问题是由HashMap存储数百万个String对象引起的 - 但是我的应该只有"只有"存储大约20.000个Node对象。
请帮我找到代码中有问题的部分。错误报告下面源代码中标记的行。
这是我的代码:
HashMap<String,TweetNode> allNodes = new HashMap<String,TweetNode>();
// read file
try {
BufferedReader br = new BufferedReader(new FileReader(graphFile));
noOfNodes = 0;
String line = br.readLine();
String firstNode;
String[] lineContent;
while (line != null) {
lineContent = line.split("\t"); // error occurs here!
// always look at the first node
firstNode = lineContent[0];
if (! allNodes.containsKey(firstNode)) {
allNodes.put(firstNode, new TweetNode(noOfNodes, firstNode));
noOfNodes++;
}
allNodes.get(firstNode).addNeighbour(lineContent[1], Double.valueOf(lineContent[2]));
line = br.readLine();
}
br.close();
}
// ... catch stuff ...
return allNodes;
}
答案 0 :(得分:0)
我在这里看到的唯一问题是你的地图。 Map正在填满堆内存。您应该使用低堆内存运行应用程序。通过访问以下参数来检查当前值,并将它们设置为合理的高值。
标志Xmx指定Java虚拟机(JVM)的最大内存分配池,而Xms指定初始内存分配池。