2012-08-30 39 views
10

OrientDB官方網站說:OrientDB慢寫

公共硬件上存儲多達150.000文件每秒,10張 數十億每天的文檔。大圖只需幾毫秒就可以加載,而不會執行代價高昂的JOIN,如Relational DBMS。

但是,執行下面的代碼表明它需要~17000ms來插入150000個簡單的文檔。

import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx; 
import com.orientechnologies.orient.core.record.impl.ODocument; 

public final class OrientDBTrial { 

    public static void main(String[] args) { 
     ODatabaseDocumentTx db = new ODatabaseDocumentTx("remote:localhost/foo"); 
     try { 
      db.open("admin", "admin"); 

      long a = System.currentTimeMillis(); 
      for (int i = 1; i < 150000; ++i) { 
       final ODocument foo = new ODocument("Foo"); 
       foo.field("code", i); 
       foo.save(); 
      } 
      long b = System.currentTimeMillis(); 
      System.out.println(b - a + "ms"); 

      for (ODocument doc : db.browseClass("Foo")) { 
       doc.delete(); 
      } 
     } finally { 
      db.close(); 
     } 
    } 

} 

我的硬件:

  • 戴爾OptiPlex 780
  • 英特爾(R)酷睿(TM)2雙核CPU E7500 @ 2.93GHz的
  • 8GB RAM
  • Windows 7的64位

我在做什麼錯?

將10個併發線程保存分割,以最大限度地減少Java的開銷,使其在~13000ms內運行。比OrientDB的頭版說的還要慢。

+0

您是否能夠獲得最佳性能?我研究這個問題,但是我的表現比你更差 –

+0

我決定用H2代替OrientDB。 H2適合我的用例。 –

回答

3

可以實現,通過在Java中使用「平數據庫」和orientdb作爲嵌入式庫 多看這裏 http://code.google.com/p/orient/wiki/JavaAPI

說明你用的是服務器模式並將其發送大量請求到orientdb服務器, 判斷通過你的基準測試,你每秒得到~10 000個插入,這是不錯的, 例如我認爲10000個請求/秒對於任何web服務器都是非常好的性能 (而且orientdb服務器實際上是一個web服務器,你可以通過http查詢它,但我認爲java是使用二進制模式)

3

首先閱讀文檔,瞭解如何實現最佳性能!

一些提示:

- >不要實例ODocument總是:

final ODocument doc; 
    for (...) { 
    doc.reset(); 
    doc.setClassName("Class"); 
    // Put data to fields 
    doc.save(); 
    } 

- >不依靠System.currentTimeMillis() - 使用perf4j或類似的工具來測量時間,因爲第一一個測量全局系統時間,因此包括系統上運行的所有其他程序的執行時間!

+0

使用System.currentTimeMillis作爲秒錶這種長時間運行的測試沒有問題。當然,你可以在測量(並使用nanoTime)之前做一些熱身,但我不認爲這會改變結果的大小順序。你甚至可以手工測量時間,這是有效的。 – eckes

3

來自OrientDB站點的數字是針對本地數據庫進行基準測試的(沒有網絡開銷),所以如果您使用遠程協議,則會出現一些延遲。

正如克里斯蒂安指出的那樣,如果可能的話重用對象。