在Docker Neo4j – 最大堆大小导致硬崩溃137

我试图在OSX(El Capitan)上运行一个Docker容器中的Neo4j 3.1实例(通过Docker-Compose)。 一切都很好,除非我尝试增加超过默认512MB的Neo可用的最大堆空间。

根据文档 ,这可以通过添加环境variablesNEO4J_dbms_memory_heap_maxSize ,然后导致服务器包装脚本相应地更新neo4j.conf文件来实现。 我已经检查过,并且正在进行更新。

问题是,当我运行docker-compose up容器时,Neo4j实例以137状态码崩溃。 一个小小的研究告诉我,这是一个Linux硬件崩溃 ,基于堆大小的最大限制。

 $ docker-compose up Starting elasticsearch Recreating neo4j31 Attaching to elasticsearch, neo4j31 neo4j31 | Starting Neo4j. neo4j31 exited with code 137 

我的问题:

  1. 这是由于Docker或OSX的限制吗?
  2. 有没有办法修改这些限制? 如果我将请求的限制放到1GB,它会旋转起来,但是一旦我运行我的沉重查询(这是造成需要增加堆空间的原因)仍然崩溃。
  3. 我正在运行的查询是对包含全文属性的大量节点(大于150k)进行大规模更新,以便可以使用该插件将其同步到ElasticSearch。 有没有一种方法可以让Neo一步步完成500个节点,只使用密码(我宁愿避免写一个脚本,如果可以的话,感觉有点肮脏)。

我的docker-compose.yml如下所示:

 --- version: '2' services: # ---<SNIP> neo4j: image: neo4j:3.1 container_name: neo4j31 volumes: - ./docker/neo4j/conf:/var/lib/neo4j/conf - ./docker/neo4j/mnt:/var/lib/neo4j/import - ./docker/neo4j/plugins:/plugins - ./docker/neo4j/data:/data - ./docker/neo4j/logs:/var/lib/neo4j/logs ports: - "7474:7474" - "7687:7687" environment: - NEO4J_dbms_memory_heap_maxSize=4G # ---<SNIP> 

  1. 这是由于Docker或OSX的限制吗?

    增加Docker可用内存的数量来解决此问题。

  2. 有没有办法修改这些限制? 如果我将请求的限制放到1GB,它会旋转起来,但是一旦我运行我的沉重查询(这是造成需要增加堆空间的原因)仍然崩溃。

    Docker内存设置

  3. 我正在运行的查询是对包含全文属性的大量节点(大于150k)进行大规模更新,以便可以使用该插件将其同步到ElasticSearch。 有没有一种方法可以让Neo一步步完成500个节点,只使用密码(我宁愿避免写一个脚本,如果可以的话,感觉有点肮脏)。

    N / A这是一个NEO4J的具体问题。 从上面列出的Docker问题中分离出来可能会更好。

3.我正在运行的查询是对包含全文属性的大量节点(大于150k)进行大规模更新,以便可以使用该插件将其同步到ElasticSearch。 有没有一种方法可以让Neo一步步完成500个节点,只使用密码(我宁愿避免写一个脚本,如果可以的话,感觉有点肮脏)。

你可以在neo4j的apoc插件的帮助下做到这一点,更具体的apoc.periodic.iterateapoc.periodic.commit

如果你将使用apoc.periodic.commit你的第一场比赛应该是特定的,比如你标记你已经同步了哪些节点,因为它有时落在循环中:

 call apoc.periodic.commit(" match (user:User) WHERE user.synced = false with user limit {limit} MERGE (city:City {name:user.city}) MERGE (user)-[:LIVES_IN]->(city) SET user.synced =true RETURN count(*) ",{limit:10000}) 

如果你使用apoc.periodic.iterate你可以在并行模式下运行它:

 CALL apoc.periodic.iterate( "MATCH (o:Order) WHERE o.date > '2016-10-13' RETURN o", "with {o} as o MATCH (o)-[:HAS_ITEM]->(i) WITH o, sum(i.value) as value CALL apoc.es.post(host-or-port,index-or-null,type-or-null, query-or-null,payload-or-null) yield value return *", {batchSize:100, parallel:true}) 

请注意,不需要第二个MATCH子句, apoc.es.post是一个可以发送post请求到弹性search的apoc.es.post的函数。 请参阅文档了解更多信息