【发布时间】:2015-06-09 09:32:02
【问题描述】:
我想逐行读取我的 .csv 文件,以免一次将所有内容加载到 RAM 中。我认为这是做到这一点的方法。我还以一种在循环中不声明任何变量的方式编写代码,以使 JVM 免于总是创建新对象和运行垃圾收集器。
但是,我一直遇到此“超出限制的 GC 开销”错误。我的 CPU 也几乎 100% 运行。
Here 问题是由存储数百万个 String 对象的 HashMap 引起的 - 但我应该“只”存储大约 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;
}
【问题讨论】:
-
我认为如果你只是调试你的代码应该没问题。
-
@StefanFalk 你能详细说明你的意思吗?你的意思是使用调试工具?我在这方面没有那么有经验。它们会在 GC 收集开始时显示吗?您建议如何使用它?
-
感谢所有没有 cmets 的反对票。我真的从中学到了很多。 [/讽刺关闭]
-
@anjuta 当您填充
HashMap时,您可能只是在填满现有的堆内存。例如,使用jstat工具调查使用的堆内存。我不确定,但我的猜测是,由于缺乏对应用程序内存行为的研究,这个问题被否决了。 -
你能说说你的堆内存大小吗?