簡體   English   中英

使用Cypher for Neo4J的Java API與Python的性能

[英]Performance of Java API versus Python with Cypher for Neo4J

我正在使用一個使用包含大約1000萬個節點的Neo4J圖的應用程序。 我每天運行的主要任務之一是將新的/更新的節點批量導入圖表,大約1-2百萬。 在結合使用Python腳本和Cypher查詢語言進行實驗后,我決定嘗試使用Java API嵌入圖形,以獲得更好的性能結果。

我發現使用本機Java API提高了5倍。 我正在使用Neo4j 2.1.4,我相信這是最新的。 我在其他帖子中讀過嵌入式圖表有點快,但這應該/可能會在不久的將來發生變化。 我想與觀察到類似結果的任何人一起驗證我的發現嗎?

我在下面包含了一些片段,只是為了給出一般使用的方法 - 代碼已經大大簡化了。

來自cypher / python的示例:

cnode = self.graph_db.create(node(hash = obj.hash,
    name = obj.title,
    date_created = str(datetime.datetime.now()),
    date_updated = str(datetime.datetime.now())
))

使用java從嵌入圖中的示例:

final Node n = Graph.graphDb.createNode();
for (final Label label : labels){
    n.addLabel(label);
}
for (Map.Entry<String, Object> entry : properties.entrySet()) {
    n.setProperty(entry.getKey(), entry.getValue());
}

感謝您的見解!

你在這里真正做的是比較兩種不同API的速度,並且只使用兩種不同的語言來做到這一點。 因此,你不是喜歡比較。 Python核心API和Python(以及其他語言)使用的REST API具有不同的習慣用法,例如顯式和隱式事務。 此外,與REST API相關的網絡延遲會產生很大的不同,特別是如果您為每個創建的節點使用一個HTTP調用。

因此,為了獲得更有意義的性能比較,請確保您正在進行比較:通過REST API使用Java或使用Cypher進行兩種測試。

提示1:通過將大量請求批量處理到單個API調用中,您將在REST上獲得更好的性能。

提示2:REST API永遠不會像核心API一樣快,因為后者是原生的,前者有更多的層要經過。

如果沒有適當的性能測量,很難說時間在哪里。 通常,Python腳本比Java慢,但編寫代碼的語言更快,因此您可以將開發速度換成執行速度。

例如:上面的代碼在Python中運行需要一個小時,在Java中需要12分鍾。 編寫Python版本花了1天時間,Java版本花了3天時間。 這意味着你需要運行代碼至少2天/(60 - 12)分鍾= 60次才能達到收支平衡。

當然,只要你能夠等待48分鍾讓Python完成它的工作,這個例子才有意義。 如果您的系統在導入時停機,那么60對12分鍾會產生巨大的差異 - 除非您可以在夜晚無人問津的情況下運行它。

如果您使用Java與Python 3( http://benchmarksgame.alioth.debian.org/u32/benchmark.php?test=all&lang=java&lang2=python3&data=u32 )進行“基准測試游戲”,則可以將其改進5倍Java版本肯定是合理的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM