我试图将数据从Twitter的用户和关注者的50MB文本文件导入到Neo4j。但是我的代码只运行到大约10000个节点并抛出错误:" java.lang.OutOfMemoryError:GC开销限制超过"。这是我的代码,我不知道我哪里做错了?
BufferedReader br = new BufferedReader(new FileReader(inputFile));
String currentLine;
String token[] = null;
try (Transaction tx = graphDb.beginTx()) {
Label userLabel = DynamicLabel.label("User");
while((currentLine = br.readLine()) != null) {
if(!currentLine.equals("\n")) token = currentLine.split("\t");
if(token.length > 2) {
userNode = graphDb.createNode(userLabel);
userNode.setProperty("username", token[2]);
userNode.setProperty("id", token[1]);
userNode.setProperty("cookie", token[0]);
System.out.println("Insert user: " + token[0] + " " + token[1] + " " + token[2]);
System.out.println("Insert follower...");
for(int i=3;i<token.length;i++) {
followerNode = graphDb.createNode(userLabel);
followerNode.setProperty("id", token[i]);
relationship = userNode.createRelationshipTo(followerNode, RelTypes.FOLLOWED_BY);
}
System.out.println("Insert follower: done! - " + (token.length-3));
}
}
tx.success();
}
br.close();
答案 0 :(得分:1)
你的问题不是neo4j,而是java。具体来说,您的堆超过了最大大小。
你可以:
a)优化你的代码,使你的堆不会变得越来越大(我通常不会谈论优化,直到开发的后期阶段,但你必须浪费大量的在某处堆积空间,特别是如果您的输入文件只有50 MB)
b)使用以下命令行参数运行java,这允许您覆盖最大堆大小:-Xmx1024m
。这将设置为1024 MB,但您可以用您需要的任何内容替换1024
。