2012-02-03 64 views
3

我看到了嵌入式Neo4j的一些相當不可能的性能結果,表面上它的速度比預期的要慢幾個數量級,所以我假設我在做「錯誤的「,儘管我沒有做任何複雜的事情。Neo4j慢?我一定在做錯什麼,請告訴我它是什麼

我使用Neo4j的

from neo4j import GraphDatabase 
db = GraphDatabase('/tmp/neo4j') 

我創建了假冒產品1500與簡單的屬性最新的嵌入式Python綁定(https://github.com/neo4j/python-embedded):

fake_products = [{'name':str(x)} for x in range(0,1500)] 

...和創建的節點了出來,我連接到subreference節點:

with db.transaction: 
    products = db.node() 
    db.reference_node.PRODUCTS(products) 

    for prod_def in fake_products: 
     product = db.node(name=prod_def['name'])   
     product.INSTANCE_OF(products) 

現在用什麼樣子,對我來說,因爲幾乎完全一樣樣的代碼,我的文檔中看到:

PRODUCTS = db.getNodeById(1) 
for x in PRODUCTS.INSTANCE_OF.incoming: 
    pass 

......通過這些節點1500迭代花費> 0.2秒對我的MacBook Pro。什麼。 (編輯:當然,我跑這個查詢一堆時間,以便至少在python綁定它不是冷緩存的問題)

我陶醉它到15K,花了2秒。我下載的Gremlin併發出等效的查詢,調查,如果它的Neo4j或Python綁定:

g.v(1).in("INSTANCE_OF") 

..它似乎花了大約2秒的第一次嘗試,在第二次運行它似乎幾乎立即完成。

任何想法爲什麼它如此緩慢?我得到的結果在我看來是一種錯誤。

回答

1

這是Neo4j懶洋洋地加載數據,沒有做任何預取。在第一次運行時,您正在碰到磁盤,第二次,緩存變暖,這是您的真實生產場景。

+0

感謝您的答案彼得,我假設我創建和連接數據的方式是好的? 但是關於你的答案 - 這不是我在Python綁定結果中看到的 - 至少上面的遍歷連續多次都會花費相同的時間。 – Wojtek 2012-02-03 15:27:17

+0

那麼,在gremlin/groovy/java這塊土地上它速度很快,但不是通過Python? – 2012-02-04 14:49:42

+0

唉,試圖在OSX Lion上安裝JPype沒有成功,希望重現它:/ – 2012-02-05 16:06:00

相關問題