2014-10-27 38 views
2

在我們的系統中有一個(很常見)的情況,用戶的行爲可以觸發操作,涉及將標籤設置/從節點之間的關係總計數十萬個實體的關係。 (從100K節點中刪除標籤A,將標籤B設置爲80K標籤,將屬性[x,y,z]設置爲20K節點等等)。當然,我不能在一次交易中把它們全部擠走,並且,由於這些節點可以很容易地分成大量的子集,因此我在一些單獨的事務中執行這些操作,當然這些事務當然會中斷所有的ACIDity,但在性能方面令我們滿意。但是,如果我試圖將這些交易嵌套到一個大型交易中以將它們全部統一爲,則該頂級交易會嘗試跟蹤所有內部交易對數據庫的更新,這當然會導致極差的性能。處理大型交易:任何時間/內存權衡?

你們可以推薦我解決這個問題嗎?

我的配置(當然,它的相關部分):

"org.neo4j.server.database.mode" : "HA", 
"use_memory_mapped_buffers" : "true", 
"neostore.nodestore.db.mapped_memory" : "450M", 
"neostore.relationshipstore.db.mapped_memory" : "450M", 
"neostore.propertystore.db.mapped_memory" : "450M", 
"neostore.propertystore.db.strings.mapped_memory" : "300M", 
"neostore.propertystore.db.arrays.mapped_memory" : "50M", 
"cache_type" : "hpc", 
"dense_node_threshold" : "15", 
"query_cache_size" : "150" 

任何提示和線索,我們非常感激:)

+0

你提供了多少堆?如果你有合理的堆大小(例如4到16GB,你應該可以將1M操作合併到一個巨大的Tx中)。 – 2014-10-30 02:59:06

+0

您當然不需要450M節點存儲,請閱讀mmio緩存配置部分,或者查看您的存儲文件以找到適合mmio配置的明智值。 – 2014-10-30 03:00:09

+0

我讀了這部分並做了數學計算,實際上它比我現在需要的要多一點,但還有其他一些操作,比如選擇(可能大約100K)具有特定標籤的節點並從中讀取一些屬性,並且可能會有> 1同時要求這樣的性質,所以我決定在那裏放一些(不)相當大的數字。 – tkroman 2014-10-30 10:16:48

回答

3

你是正確的,修改成千上萬的實體作爲用戶的結果在同一個交易中的行爲不會被執行。正如您正確指出的那樣,Neo4j中的嵌套事務只是「安慰劑」事務。

我會先考慮替代策略來實現您的目標(我一無所知),而無需更新太多的實體。

如果不可行,我會問是否可以在用戶操作後的短時間內發生更新。如果答案是肯定的,那麼我會將一個關於用戶操作的消息存儲在一個持久隊列中,這將會異步處理。這樣,用戶調用會很快返回,最終發生更新。

最後,如果在用戶操作和大型更新之間的時間花費更長的時間是可以接受的,我會考慮和「代理」不斷爬取圖並更新它遇到的實體的標籤,如反對交易驅動的更新。看看GraphAware NodeRank的靈感。