Neo4j Java VM调优(v2.3社区)

时间:2015-11-06 01:15:31

标签: neo4j jvm

据我所知,我的Neo4j v2.3社区Java VM在旧Gen Heap中添加项目时遇到问题,而且无法收集垃圾。

以下是详细的情况概述。

我有一个调用Dropbox Delta API的PHP文件,并将文件结构写入我的Neo4j数据库。每次调用Delta都会返回一个2000项数据集,其中我提取了我需要的信息,以下是一个例子,该查询只有一个项目,通常我发送完整批次的2000个项目,因为它给了我最好的结果。

***Following is an example Query***
MERGE (c:Cloud { type:'Dropbox', id_user:'15', id_account:''})
WITH c
UNWIND [
    { parent_shared_folder_id:488417928, rev:'15e1d1caa88',.......}
    ] 
AS items MERGE (i:Item { id:items.path, id_account:'', id_user:'15', type:'Dropbox' })
ON Create SET i = { id:items.path, id_account:'', id_user:'15', is_dir:items.is_dir, name:items.name, description:items.description, size:items.size, created_at:items.created_at, modified:items.modified, processed:1446769779, type:'Dropbox'}
ON Match  SET i+= { id:items.path, id_account:'', id_user:'15', is_dir:items.is_dir, name:items.name, description:items.description, size:items.size, created_at:items.created_at, modified:items.modified, processed:1446769779, type:'Dropbox'}
MERGE (p:Item {id_user:'15', id:items.parentPath, id_account:'', type:'Dropbox'})
MERGE (p)-[:Contains]->(i)
MERGE (c)-[:Owns]->(i)


***The query is sent via Everyman****

static function makeQuery($client, $qry) {
    return new Everyman\Neo4j\Cypher\Query($client, $qry);
}

这样可以正常工作,一般从开始到结束需要8-10秒才能运行。

我正在访问的Dropbox帐户包含大约35000个项目,并且需要大约18次运行我的PHP以使用保管箱帐户的文件夹/文件结构填充我的Neo4j数据库。

每次运行此PHP时,大约50mb的项目都会添加到Neo4j JVM Old Gen堆中,其中30mb的项目不会被GC删除。

最终结果显然是VM耗尽内存并陷入GC限制的持续状态。

我尝试了一系列Neo4j VM设置,以及从Neo4j v2.2.5到v2.3的更新,这实际上似乎使问题变得更糟。

我目前的设置如下,

-server
-Xms4096m
-Xmx4096m
-XX:NewSize=3072m
-XX:MaxNewSize=3072m
-XX:SurvivorRatio=1

我正在使用8GB内存和i5 2.5GHz四核的Windows 10 PC进行测试。 Java 1.8.0_60

非常感谢有关如何解决此问题的任何信息。 干杯,杰克。

1 个答案:

答案 0 :(得分:1)

将新尺寸减小到1024米

将您的设置更改为:

-server
-Xms4096m
-Xmx4096m
-XX:NewSize=1024m

tx的大小很可能会变得太大。

我建议分别发送每个父母,因此代替UNWIND发送一个语句。

确保使用新的事务性http端点,我建议用neoclient代替Neo4jPHP

您还应该使用参数而不是文字值!!!

并且不要在每个项目上重复使用用户ID和类型等属性。

您确定要将所有内容连接到c而不仅仅是目录结构的根目录吗?我会做后者。

MERGE (c:Cloud:Dropbox { id_user:{userId}})

MERGE (p:Item:Dropbox {id:{parentPath}})
// owning the parent should be good enough
MERGE (c)-[:Owns]->(p)

WITH c
UNWIND {items} as item
MERGE (i:Item:Dropbox { id:item.path})
ON Create SET i += { is_dir:item.is_dir, name:item.name, created_at:item.created_at }
SET i += { description:item.description, size:item.size, modified:items.modified, processed:timestamp()}
MERGE (p)-[:Contains]->(i);

确保使用2.3.0以获得最佳的MERGE关系表现。