0

我正在使用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 在他的批量进口商中做了什么不同的事情?我看了一眼代码,但我真的不知道他是如何做到的。

4

0 回答 0