2016-05-16 106 views
1

我已經使用導入工具讀取約100萬個節點。現在是時候設定關係了。 (不幸的是,如果你想使用導入工具,你必須在csv中明確地預先確定關係,所以這是不可能的。)neo4j'Java堆空間'錯誤 - 增加內存分配失敗時

我做的第一件事就是在節點上放一個索引。

接下來,我寫了這個,我不知道是我的問題 - 即使有一個索引,這種說法可能會引起太多笛卡爾積?:

USING PERIODIC COMMIT 500 
LOAD CSV WITH HEADERS FROM 
'file:///home/monica/...relationship.csv' AS line 
MATCH (p1:Player {player_id: line.player1_id}), (p2:Player {player_id: line.player2_id}) 
MERGE (p1)-[:VERSUS]-(p2) 

顯然,USING PERIODIC COMMIT 500沒有幫助,因爲我得到了我的錯誤,

Java heap space 

周圍的Googling,我才知道這可能有助於更改的Neo4j-wrapper.conf文件我的內存設置,所以我改變了設置,一路高達4GB(我有一個8GB的系統):

wrapper.java.initmemory=4096 
wrapper.java.maxmemory=4096 

還是得到了同樣的錯誤。

現在,我卡住了。我想不出任何其他策略,除此之外:

1)重寫語句
2)使用更多RAM的系統?
3)找到一些其他方式分批運行這個?

任何意見都會很棒。感謝neo4j SO社區提前。

回答

1

:Player(player_id)有沒有索引或唯一約束?如果前者刪除索引並添加唯一約束。否則,可能有多個播放器節點共享相同的player_id - 這可能會導致笛卡爾積,假設您有10倍於同一個播放器,這將最終以csv的每一行的100個組合結束。

一旦你確定沒有這種重複,接下來要檢查的是EagerPipe。如果查詢計劃(不PERIODIC COMMIT

EXPLAIN LOAD CSV WITH HEADERS FROM 
'file:///home/monica/...relationship.csv' AS line 
MATCH (b1:Player {player_id: line.player1_id}), (p2:Player {player_id:  line.player2_id}) 
MERGE (p1)-[:VERSUS]-(p2) 

顯示了eager然後PERIODIC COMMIT東西不適用,見http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/瞭解詳情。

更新近的Neo4j版本可能會發生這種情況。

更新

我剛剛意識到:你在比賽中和在合併一個p1使用b1 - 因此後者不存在,並且被作爲合併過程中的新節點創建。

能不能請你:

USING PERIODIC COMMIT 500 
LOAD CSV WITH HEADERS FROM 
'file:///home/monica/...relationship.csv' AS line 
MATCH (p1:Player {player_id: line.player1_id}) 
MATCH (p2:Player {player_id: line.player2_id}) 
MERGE (p1)-[:VERSUS]-(p2) 
+0

我照你說的;我刪除了索引,添加了一個唯一約束,然後檢查了查詢計劃。確實......有一種「渴望」的潛伏!現在我需要閱讀文檔,看看如何解決這個問題。謝謝你指點我這個方向。 –

+0

Mark Needham博客的鏈接建議在'LOAD CSV'的任何迭代過程中避免做太多事情。就我而言,我只是在'LOAD CSV'的一次迭代中做了一件事... –

+0

你正在使用哪個neo4j版本? –

相關問題