2015-11-06 39 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天。 –