2012-08-16 33 views
0

非常簡單,我需要將時間序列數據存儲在文檔中。我已經決定有一份30分鐘的數據文件是合理的。文檔可能如下所示:Mongo C驅動程序,儘快更新文檔

但這只是每秒鐘將更新的數百/千個文檔中的一個。

{ 
    _id: "APAC.tky001.cpu.2011.12.04:10:00", 
    field1: XX, 
    field2: YY, 
    1322971800: 22, 
    1322971801: 23, 
    1322971802: 21, 

    // and so on 
} 

這意味着,每30分鐘一班,我創建_idfield1field2文檔。然後,我想每秒添加一個時間戳/值組合。

我正在使用mongo c庫,我假設它會超快,但我這樣做的方式需要mongo_update,這是不能批量完成的。我不認爲有一種方法可以使用mongo_insert_batch

不幸的是,它超級慢 - 糟糕的表現。我是否完全不正確?可怕的是,我的意思是,通過做一些粗糙的工作,我得到600 /秒,在一個備用數據庫(不命名的名稱),我得到27,000 /秒。

代碼大約是:

for (i=0;i<N;i++) { 
    if (mongo_update(c,n,a,b,MONGO_UPDATE_UPSERT,write_concern) != MONGO_OK) 
     // stuff 
} 

設置寫入關注或關閉沒有差別。

+1

1更新聽起來很合理。也許你可以發佈一些代碼?此外,每秒創建一個新文檔可能會更快,因爲它會減少文檔的潛在碎片。 – Cameron 2012-08-16 02:47:37

+0

你的實際更新代碼是什麼? – 2012-08-16 02:50:02

+1

@Cameron - 想要接近30-40k插入每秒 – stackmate 2012-08-16 03:08:39

回答

2

您的更新很可能會使文檔每次都超出範圍。這意味着更新不再便宜,因爲mongo必須將文檔複製到新位置。 您可以通過在創建文檔時插入一些大的虛擬值並稍後刪除文檔來手動填充文檔,以便您的更新在原地發生。我不確定是否可以直接操作集合級別的paddingFactor。

在另一個未命名的數據庫中,您可能會爲每個條目插入一行,這與您在此處執行的操作完全不同。

+0

雖然這不是問題的根源,但它非常有幫助。我的問題是設置了write_concern。這意味着API正在等待mongo的迴應,表示在繼續前進之前一切正常。這延遲了插入每次大約700ms。 – stackmate 2012-08-17 00:48:38

0

蒙戈最新的C-驅動程序不支持批量插入:每秒

http://api.mongodb.org/c/current/bulk.html#bulk-insert

#include <assert.h> 
#include <bcon.h> 
#include <mongoc.h> 
#include <stdio.h> 

static void 
bulk1 (mongoc_collection_t *collection) 
{ 
    mongoc_bulk_operation_t *bulk; 
    bson_error_t error; 
    bson_t *doc; 
    bson_t reply; 
    char *str; 
    bool ret; 
    int i; 

    bulk = mongoc_collection_create_bulk_operation (collection, true, NULL); 

    for (i = 0; i < 10000; i++) { 
     doc = BCON_NEW ("i", BCON_INT32 (i)); 
     mongoc_bulk_operation_insert (bulk, doc); 
     bson_destroy (doc); 
    } 

    ret = mongoc_bulk_operation_execute (bulk, &reply, &error); 

    str = bson_as_json (&reply, NULL); 
    printf ("%s\n", str); 
    bson_free (str); 

    if (!ret) { 
     fprintf (stderr, "Error: %s\n", error.message); 
    } 

    bson_destroy (&reply); 
    mongoc_bulk_operation_destroy (bulk); 
} 

int 
main (int argc, 
     char *argv[]) 
{ 
    mongoc_client_t *client; 
    mongoc_collection_t *collection; 

    mongoc_init(); 

    client = mongoc_client_new ("mongodb://localhost/"); 
    collection = mongoc_client_get_collection (client, "test", "test"); 

    bulk1 (collection); 

    mongoc_collection_destroy (collection); 
    mongoc_client_destroy (client); 

    mongoc_cleanup(); 

    return 0; 
} 
相關問題