Transactions Neo4j在插入大数据时引发java.lang.OutOfMemory异常
每个人 我的程序在插入大数据时引发java.lang.OutOfMemory异常,尽管我使用了一些tunning技巧,如更改java_选项和事务批处理提交。我听说JVM将在Neo4J提交其事务时减少内存使用。但它似乎不起作用。 当它处理7000000行异常时,有什么建议吗 这是我的Neo4j属性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=
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