2015-04-06 69 views
0

我正在運行批量導入數據到一個neo4j實例(我運行在2.2.0社區和企業版以及2.1.7社區)運行在服務器模式。我的應用程序在內存中創建了一堆節點,並且會按時週期停下來編寫一系列.csv文件並將密碼發送到neo4j實例以上載文件。 (這是由於使用普通的舊REST API運行應用程序時出現的性能問題)。垃圾收集調整/性能下降neo4j批量.csv導入

總的來說,我期待上傳類似150-5000萬個節點的東西,所以這是原則上neo4j聲稱能夠處理得相當好的東西的類型。

好吧,無論如何,當我針對生產數據運行時,我注意到的是,應用程序運行在兩種狀態 - 一種是csv上載每秒處理2k-8k節點,另一種是處理它的進程每秒80-200個節點。當你將上傳視爲一個時間序列時,這兩個狀態是交織在一起的,隨着時間的推移,它在慢速狀態下花費的時間越來越長。

節點通過一系列

MERGE (:{NODE_TYPE} {csvLine.key = n.primaryKey}) on create set [PROPERTY LIST]; 

語句創建的,我有我做的合併對一切指標。這並不像插入語句中的降級,因爲減速不是線性的,而是雙峯的,這就像neo4j實例中有垃圾收集一樣。調整neo4j JVM垃圾收集器進行頻繁批量插入的最佳方式是什麼?

neo4j.properties:

neostore.nodestore.db.mapped_memory=50M 
neostore.relationshipstore.db.mapped_memory=500M 
#neostore.relationshipgroupstore.db.mapped_memory=10M 
neostore.propertystore.db.mapped_memory=100M 
#neostore.propertystore.db.strings.mapped_memory=130M 
neostore.propertystore.db.arrays.mapped_memory=130M 

的Neo4j-wrapper.conf:

wrapper.java.additional=-XX:+UseConcMarkSweepGC 
wrapper.java.additional=-XX:+CMSClassUnloadingEnabled 
wrapper.java.additional=-XX:-OmitStackTraceInFastThrow 
wrapper.java.additional=-XX:hashCode=5 

wrapper.java.initmemory=8194 
wrapper.java.maxmemory=8194 

這感覺就像甜蜜點都整體堆內存和neostore東西。增加整體堆降低性能。也就是說,neo4j垃圾收集日誌經常會有GC(分配失敗)消息。

編輯:響應邁克爾飢餓:

該機擁有64 GB的RAM,並且似乎沒有任何被刷爆。它似乎也只是在任何時候只使用少量的內核。垃圾收集器分析顯示垃圾收集器似乎運行頻繁。

確切暗號語句,例如:

USING PERIODIC COMMIT 110000 LOAD CSV WITH HEADERS FROM 'file:///home/jschirmer/Event_2015_4_773476.csv' AS csvLine MERGE (s:Event {primaryKey: csvLine.primaryKey}) ON CREATE SET s.checkSum= csvLine.checkSum,s.epochTime= toInt(csvLine.epochTime),s.epochTimeCreated= toInt(csvLine.epochTimeCreated),s.epochTimeUpdated= toInt(csvLine.epochTimeUpdated),s.eventDescription= csvLine.eventDescription,s.fileName= csvLine.fileName,s.ip= csvLine.ip,s.lineNumber= toInt(csvLine.lineNumber),s.port= csvLine.port,s.processPid= csvLine.processPid,s.rawEventLine= csvLine.rawEventLine,s.serverId= csvLine.serverId,s.status= toInt(csvLine.status); 

USING PERIODIC COMMIT 110000 LOAD CSV WITH HEADERS FROM 'file:///home/jschirmer/Event__File_2015_4_773476.csv' AS csvLine MATCH (n:SC_CSR{primaryKey: csvLine.Event_id}), (s:File{fileName: csvLine.File_id}) MERGE n-[:DATA_SOURCE]->s; 

雖然有正在取得 我已經嘗試了單個併發事務以及運行serveral的這樣的語句數(〜3)這樣的語句並聯(這提供了大約2倍的改進)。我試着調整定期提交頻率和文件的大小。當csv文件大約爲10萬行時,這似乎最大化了性能,這意味着實際上,定期提交可以關閉。

我還沒有運行在statables上的配置文件。我會這麼做的,但我認爲通過使用MERGE ...來避免急切的合併問題...在創建語句上。

回答

0

通常你的配置看起來不錯,你的機器有什麼RAM?

對於你合併的東西,我建議約束而不是索引。

你的tx尺寸是多少?你運行多少個併發tx?

而不是你的通用合併語句(不會編譯)你能分享具體的語句嗎?

您是否描述過這些陳述?也許你碰上急於管問題:

http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/

你使用定期提交?

你CSV文件有多大?

參見:http://neo4j.com/developer/guide-import-csv/

+0

更新了OP。 –