2015-11-06 40 views
0

从我能告诉我有一个问题与我的Neo4j v2.3社区Java VM添加项目到旧​​Gen堆,永远不能垃圾收集他们。Neo4j Java虚拟机调优(v2.3社区)

以下是详细的情况。

我有一个PHP文件,它调用Dropbox Delta API并将文件结构写出到我的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才能使用Dropbox帐户的文件夹/文件结构填充我的Neo4j数据库。

随着这个PHP的每次运行,大约50MB的项目被添加到Neo4j JVM Old Gen堆中,30mb未被GC删除。

最终结果显然是虚拟机内存耗尽,并陷入GC节流的不变状态。

我试过了一系列的Neo4j虚拟机设置,以及从Neo4j v2.2.5到v2.3的更新,这实际上已经使问题变得更糟。

我目前的设置如下,

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

我在Windows 10的测试用PC的RAM和8GB的酷睿i5 2.5GHz的四核处理器。 Java 1.8.0_60

有关如何解决此问题的任何信息将不胜感激。 干杯,杰克。

回答

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性能的关系。

+0

感谢您的回复,问题似乎有所减轻。 到目前为止,我们已经管理转换查询使用参数和更新服务器设置。现在正在考虑切换neo4j客户端。 大量的项目仍然达到了我所关心的老一代,因为neo4j性能调优指南指出 '堆的理想尺寸和调节方式应使得事务和查询状态永远不会对老一代产生影响。 在运行完PHP提到的变化后,我们仍然以〜700mb添加到老一代,但至少现在全部用GC删除了。 –

+0

当它出现在几个版本中时,也尝试更新到2.3.1天。 –