Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Transactions Neo4j在插入大数据时引发java.lang.OutOfMemory异常_Transactions_Neo4j_Out Of Memory - Fatal编程技术网

Transactions Neo4j在插入大数据时引发java.lang.OutOfMemory异常

Transactions Neo4j在插入大数据时引发java.lang.OutOfMemory异常,transactions,neo4j,out-of-memory,Transactions,Neo4j,Out Of Memory,每个人 我的程序在插入大数据时引发java.lang.OutOfMemory异常,尽管我使用了一些tunning技巧,如更改java_选项和事务批处理提交。我听说JVM将在Neo4J提交其事务时减少内存使用。但它似乎不起作用。 当它处理7000000行异常时,有什么建议吗 这是我的Neo4j属性 neostore.propertystore.db.index.keys.mapped_memory=20M neostore.propertystore.db.index.mapped_memory=

每个人

我的程序在插入大数据时引发java.lang.OutOfMemory异常,尽管我使用了一些tunning技巧,如更改java_选项和事务批处理提交。我听说JVM将在Neo4J提交其事务时减少内存使用。但它似乎不起作用。 当它处理7000000行异常时,有什么建议吗

这是我的Neo4j属性

neostore.propertystore.db.index.keys.mapped_memory=20M
neostore.propertystore.db.index.mapped_memory=20M
neostore.nodestore.db.mapped_memory=400M
neostore.relationshipstore.db.mapped_memory=1000M
neostore.propertystore.db.mapped_memory=400M
neostore.propertystore.db.strings.mapped_memory=400M
这是我的JVM选项

 java -jar -server -Xmx2G -XX:+UseConcMarkSweepGC neodataio.jar $@
这是我的密码

public Node createNode(String type, String v) {
stype = type;
UniqueFactory.UniqueNodeFactory factory = new UniqueFactory.UniqueNodeFactory(
    db, type) {
    @Override
    protected void initialize(Node created,
        Map<String, Object> properties) {
    created.addLabel(DynamicLabel.label(stype));
    created.setProperty("v", properties.get(stype));
    }

};
return factory.getOrCreate(type, v);
}

private void processLine(String line) {
line = stripeStr(line);
String[] fields = line.split("["+splitor+"]");
List<Node> row = new ArrayList<Node>();
Map<String,Boolean> unqi = new HashMap<String,Boolean>();
for (String field : fields) {
    String[] kvs = field.split("["+kv+"]");
    if(kvs.length==2
        &&!unqi.containsKey(kvs[1])
        &&!stripeStr(kvs[1]).equals("")
        &&!stripeStr(kvs[1]).toLowerCase().equals("null")){
    Node n = createNode(stripeStr(kvs[0]), stripeStr(kvs[1]));
    row.add(n);
    unqi.put(kvs[1], true);
    }
}
if (row.size() > 1) {
    for (int i = 1; i < row.size(); i++) {
    row.get(0).createRelationshipTo(row.get(i), Importer.connect);
    }
}
}

private void processBatch(ArrayList<String> batch){
Transaction tx = db.beginTx();
try {
    for(String line : batch) {        
        processLine(line);        
    }    
    tx.success();
} finally {
    tx.close();
}
}

private String stripeStr(String str){
return str.trim().replace("\n", "").replace("\t", "");
}

public void processFile(String filepth) throws IOException {
long begin = new Date().getTime();
File f = new File(filepth);
FileInputStream fi = new FileInputStream(f);
BufferedReader dr=new BufferedReader(new InputStreamReader(fi)); 
String line;
int i = 1;
ArrayList<String> batch = new ArrayList<String>();
while((line=dr.readLine())!=null){
    batch.add(line);
    if(i%batchsize == 0){
    processBatch(batch);
    batch = new ArrayList<String>();
    System.out.println(i);
    }
    i++;
}
processBatch(batch);
System.out.println(i);
long end = new Date().getTime();
System.out.println("cost time:"+(end-begin));
}
公共节点createNode(字符串类型,字符串v){
stype=类型;
UniqueFactory.UniqueNodeFactory=新UniqueFactory.UniqueNodeFactory(
数据库,类型){
@凌驾
受保护的void初始化(已创建节点,
地图属性){
创建.addLabel(DynamicLabel.label(stype));
created.setProperty(“v”,properties.get(stype));
}
};
返回工厂。getOrCreate(类型,v);
}
私有void进程行(字符串行){
行=条带(行);
String[]fields=line.split(“[”+splitor+“]);
列表行=新的ArrayList();
Map unqi=新的HashMap();
用于(字符串字段:字段){
字符串[]kvs=字段拆分(“[”+kv+“]”);
如果(kvs.length==2
&&!unqi.containsKey(kvs[1])
&&!stripeStr(kvs[1])等于(“”)
&&!stripeStr(kvs[1]).toLowerCase().equals(“null”)){
Node n=createNode(stripeStr(kvs[0]),stripeStr(kvs[1]);
行。添加(n);
unqi.put(kvs[1],真);
}
}
如果(row.size()>1){
对于(int i=1;i
例外情况

 Exception in thread "GC-Monitor" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOfRange(Arrays.java:2694)
    at java.lang.String.<init>(String.java:203)
    at java.lang.StringBuilder.toString(StringBuilder.java:405)
    at org.neo4j.kernel.impl.cache.MeasureDoNothing.run(MeasureDoNothing.java:84)
Exception in thread "main" org.neo4j.graphdb.TransactionFailureException: Unable to commit transaction
    at org.neo4j.kernel.TopLevelTransaction.close(TopLevelTransaction.java:140)
    at com.bfd.finance.neo4j.dataio.Importer.processBatch(Importer.java:79)
    at com.bfd.finance.neo4j.dataio.Importer.processFile(Importer.java:98)
    at com.bfd.finance.neo4j.dataio.Importer.main(Importer.java:161)
Caused by: org.neo4j.graphdb.TransactionFailureException: commit threw exception
    at org.neo4j.kernel.impl.transaction.TxManager.commit(TxManager.java:498)
    at org.neo4j.kernel.impl.transaction.TxManager.commit(TxManager.java:397)
    at org.neo4j.kernel.impl.transaction.TransactionImpl.commit(TransactionImpl.java:122)
    at org.neo4j.kernel.TopLevelTransaction.close(TopLevelTransaction.java:124)
    ... 3 more
Caused by: javax.transaction.xa.XAException
    at org.neo4j.kernel.impl.transaction.TransactionImpl.doCommit(TransactionImpl.java:553)
    at org.neo4j.kernel.impl.transaction.TxManager.commit(TxManager.java:460)
    ... 6 more
Caused by: java.lang.OutOfMemoryError: Java heap space
    at java.util.HashMap.createEntry(HashMap.java:901)
    at java.util.HashMap.putForCreate(HashMap.java:554)
    at java.util.HashMap.putAllForCreate(HashMap.java:559)
    at java.util.HashMap.<init>(HashMap.java:298)
    at org.neo4j.kernel.impl.nioneo.xa.WriteTransaction.applyCommit(WriteTransaction.java:817)
    at org.neo4j.kernel.impl.nioneo.xa.WriteTransaction.doCommit(WriteTransaction.java:751)
    at org.neo4j.kernel.impl.transaction.xaframework.XaTransaction.commit(XaTransaction.java:322)
    at org.neo4j.kernel.impl.transaction.xaframework.XaResourceManager.commitWriteTx(XaResourceManager.java:530)
    at org.neo4j.kernel.impl.transaction.xaframework.XaResourceManager.commit(XaResourceManager.java:446)
    at org.neo4j.kernel.impl.transaction.xaframework.XaResourceHelpImpl.commit(XaResourceHelpImpl.java:64)
    at org.neo4j.kernel.impl.transaction.TransactionImpl.doCommit(TransactionImpl.java:545)
    ... 7 more
线程“GC Monitor”java.lang.OutOfMemoryError中出现异常:java堆空间 位于java.util.Arrays.copyOfRange(Arrays.java:2694) 位于java.lang.String。(String.java:203) 位于java.lang.StringBuilder.toString(StringBuilder.java:405) 位于org.neo4j.kernel.impl.cache.MeasureDoNothing.run(MeasureDoNothing.java:84) 线程“main”org.neo4j.graphdb.TransactionFailureException中出现异常:无法提交事务 在org.neo4j.kernel.TopLevelTransaction.close(TopLevelTransaction.java:140)上 位于com.bfd.finance.neo4j.dataio.Importer.processBatch(Importer.java:79) 位于com.bfd.finance.neo4j.dataio.Importer.processFile(Importer.java:98) 位于com.bfd.finance.neo4j.dataio.Importer.main(Importer.java:161) 原因:org.neo4j.graphdb.TransactionFailureException:提交引发异常 位于org.neo4j.kernel.impl.transaction.TxManager.commit(TxManager.java:498) 位于org.neo4j.kernel.impl.transaction.TxManager.commit(TxManager.java:397) 位于org.neo4j.kernel.impl.transaction.TransactionImpl.commit(TransactionImpl.java:122) 在org.neo4j.kernel.TopLevelTransaction.close上(TopLevelTransaction.java:124) ... 3个以上 原因:javax.transaction.xa.XAException 位于org.neo4j.kernel.impl.transaction.TransactionImpl.doCommit(TransactionImpl.java:553) 位于org.neo4j.kernel.impl.transaction.TxManager.commit(TxManager.java:460) ... 还有6个 原因:java.lang.OutOfMemoryError:java堆空间 位于java.util.HashMap.createEntry(HashMap.java:901) 在java.util.HashMap.putForCreate(HashMap.java:554) 位于java.util.HashMap.putAllForCreate(HashMap.java:559) 在java.util.HashMap.(HashMap.java:298) 位于org.neo4j.kernel.impl.nioneo.xa.WriteTransaction.applyCommit(WriteTransaction.java:817) 位于org.neo4j.kernel.impl.nioneo.xa.WriteTransaction.doCommit(WriteTransaction.java:751) 位于org.neo4j.kernel.impl.transaction.xaframework.XaTransaction.commit(XaTransaction.java:322) 位于org.neo4j.kernel.impl.transaction.xaframework.XaResourceManager.commitWriteTx(XaResourceManager.java:530) 位于org.neo4j.kernel.impl.transaction.xaframework.XaResourceManager.commit(XaResourceManager.java:446) 位于org.neo4j.kernel.impl.transaction.xaframework.XaResourceHelpImpl.commit(XaResourceHelpImpl.java:64) 位于org.neo4j.kernel.impl.transaction.TransactionImpl.doCommit(TransactionImpl.java:545) ... 还有7个
我们所做的是每5000个节点提交一次事务,这非常有效。明显的缺点是,当节点5001出现问题时,无法回滚前5000个节点


至于批插入器。如果使用程序导入一次性数据,而不需要数据库可用于其他请求,则可以使用该数据库。对于所有其他大型导入用例,batchinserter都帮不上忙。

您可能想看看batch inserter-。还要考虑周期性地提交事务,例如每100个插入。我在批处理插入中进行了研究,但是它不能提供“获取或创建”的方式。我在代码中使用了批提交。您的批次大小是多少?是否可能是您创建了一个外部事务?所以你在这里创建的所有tx都是嵌套tx?你能发布你的JVM选项和Neo4j属性吗?我想Mine有一些问题。我们使用Neo4j的默认设置。对于JVM,我们必须添加额外的内存:-Xmx512M-XX:MaxPermSize=128M