我正在使用BatchInserter从 neo4j 数据库中获取特定属性和关系,以使用 BatchInserterIndex 编写新索引(带有数字索引)。
大约 10 分钟后,索引文件夹的大小为 4.7G,内存已完全使用,垃圾收集使其变得非常慢,再过一段时间后,VM 以垃圾收集器异常结束。
代码大致如下:
final BatchInserter bInserter = BatchInserters.inserter(this.dbStoreDir, getConfig());
final BatchInserterIndexProvider bIndexInserterProvider = new LuceneBatchInserterIndexProvider(bInserter);
final BatchInserterIndex bIndexInserter = bIndexInserterProvider.nodeIndex(indexName, getConfig());
try {
final Map<String, Object> propMap = new HashMap<>();
for (final Long id : idSet) {
this.filterProperties(bInserter.getNodeProperties(id), propMap);
for (final BatchRelationship rel : bInserter.getRelationships(id)) {
if (rel.getType().name().equals(ANYREL)) {
final Long subNodeId = rel.getEndNode();
this.filterProperties(bInserter.getNodeProperties(subNodeId).entrySet(), propMap);
this.filterProperties(bInserter.getRelationshipProperties(rel.getId()).entrySet(), propMap);
}
}
bIndexInserter.add(id, propMap);
propMap.clear();
}
} finally {
bIndexInserter.flush();
bInserter.shutdown();
bIndexInserterProvider.shutdown();
}
public static Map<String, String> getConfig() {
final Map<String, String> config = new HashMap<>();
config.put("dump_configuration", "false");
config.put("cache_type", "none");
config.put("use_memory_mapped_buffers", "true");
config.put("node_cache_size", "2G");
config.put("relationship_cache_size", "800M");
config.put("neostore.propertystore.db.index.keys.mapped_memory", "200M");
config.put("neostore.propertystore.db.index.mapped_memory", "200M");
config.put("neostore.nodestore.db.mapped_memory", "200M");
config.put("neostore.relationshipstore.db.mapped_memory", "500M");
config.put("neostore.propertystore.db.mapped_memory", "250M");
config.put("neostore.propertystore.db.strings.mapped_memory", "250M");
config.put("type", "exact");
return config;
}
我使用以下 Java VM 选项:
-D64 -Xmx13G -Xmn1G -server -XX:+UseNUMA -XX:+UseParallelGC
在具有 16GB RAM 和 Java 1.7_60 的机器上
a) 我做错了吗?
b) 是什么占用了所有的记忆?是lucene还是neo4j?
c) Michael Hunger 在他的批量进口商中做了什么不同的事情?我看了一眼代码,但我真的不知道他是如何做到的。