Mongodb Mongo C驱动程序,尽快更新文档

Mongodb Mongo C驱动程序,尽快更新文档,mongodb,mongodb-c,nosql,Mongodb,Mongodb C,Nosql,非常简单,我需要将时间序列数据存储在文档中。我已经决定,让一个文档负责30分钟的数据周期是合理的。文档可以如下所示: 但这只是每秒更新的几百/千份文档中的一份 { _id: "APAC.tky001.cpu.2011.12.04:10:00", field1: XX, field2: YY, 1322971800: 22, 1322971801: 23, 1322971802: 21, // and so on } 这意味着每隔30分

非常简单,我需要将时间序列数据存储在文档中。我已经决定,让一个文档负责30分钟的数据周期是合理的。文档可以如下所示:

但这只是每秒更新的几百/千份文档中的一份

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

    // and so on
 }
这意味着每隔30分钟,我会创建一个带有
\u id
field1
field2
的文档。然后,每秒钟我都想添加一个时间戳/值组合

我使用的是mongo c库,我假设它会非常快,但我这样做需要
mongo_更新
,而这不能批量完成。我认为没有办法使用
mongo\u insert\u batch

不幸的是,这是超慢-糟糕的表现。我这样做完全不对吗?所谓糟糕,我的意思是,通过做一些粗糙的工作,我得到600/秒,在另一个db(不命名名称)中,我得到27000/秒

代码大致如下:

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

for(i=0;i您的更新每次都可能使文档超出范围。这意味着更新不再便宜,因为mongo必须将文档复制到新位置。
您可以在创建文档时插入一些较大的伪值,然后再将其删除,从而手动填充文档,这样您的更新就会发生。我不确定您是否可以直接操作集合级填充因子


在另一个未命名的数据库中,您可能会在每个条目中插入一行,这与您在此处执行的操作完全不同。

您的更新每次都可能使文档超出范围。这意味着更新不再便宜,因为mongo必须将文档复制到新位置。 您可以在创建文档时插入一些较大的伪值,然后再将其删除,从而手动填充文档,这样您的更新就会发生。我不确定您是否可以直接操作集合级填充因子


在另一个未命名的数据库中,您可能会为每个条目插入一行,这与您在此处执行的操作完全不同。

Mongo最新的c-driver支持批量插入:

#包括
#包括
#包括
#包括
静态空隙
bulk1(mongoc_collection_t*collection)
{
mongoc_bulk_operation_t*bulk;
bson_错误\u t错误;
bson_t*文件;
b未答复;
char*str;
布尔-雷特;
int i;
bulk=mongoc\u collection\u create\u bulk\u操作(collection,true,NULL);
对于(i=0;i<10000;i++){
doc=BCON_NEW(“i”,BCON_INT32(i));
mongoc\u批量操作\u插入(批量、单据);
b关于销毁(doc);
}
ret=mongoc\u bulk\u operation\u execute(批量、回复和错误);
str=bson_as_json(&reply,NULL);
printf(“%s\n”,str);
无bson_(str);
如果(!ret){
fprintf(stderr,“错误:%s\n”,错误消息);
}
bson_销毁和回复;
mongoc_散装_操作_销毁(散装);
}
int
主(内部argc,
字符*argv[]
{
mongoc_客户_t*客户;
mongoc_collection_t*collection;
mongoc_init();
client=mongoc\u client\u new(“mongodb://localhost/");
collection=mongoc_client_get_collection(客户端,“测试”、“测试”);
第1组(收款);
mongoc_收集_销毁(收集);
mongoc_客户_销毁(客户);
mongoc_清理();
返回0;
}

Mongo最新的c-driver支持批量插入:

#包括
#包括
#包括
#包括
静态空隙
bulk1(mongoc_collection_t*collection)
{
mongoc_bulk_operation_t*bulk;
bson_错误\u t错误;
bson_t*文件;
b未答复;
char*str;
布尔-雷特;
int i;
bulk=mongoc\u collection\u create\u bulk\u操作(collection,true,NULL);
对于(i=0;i<10000;i++){
doc=BCON_NEW(“i”,BCON_INT32(i));
mongoc\u批量操作\u插入(批量、单据);
b关于销毁(doc);
}
ret=mongoc\u bulk\u operation\u execute(批量、回复和错误);
str=bson_as_json(&reply,NULL);
printf(“%s\n”,str);
无bson_(str);
如果(!ret){
fprintf(stderr,“错误:%s\n”,错误消息);
}
bson_销毁和回复;
mongoc_散装_操作_销毁(散装);
}
int
主(内部argc,
字符*argv[]
{
mongoc_客户_t*客户;
mongoc_collection_t*collection;
mongoc_init();
client=mongoc\u client\u new(“mongodb://localhost/");
collection=mongoc_client_get_collection(客户端,“测试”、“测试”);
第1组(收款);
mongoc_收集_销毁(收集);
mongoc_客户_销毁(客户);
mongoc_清理();
返回0;
}

1次每秒更新听起来很合理。也许你可以发布一些代码?另外,每秒创建一个新文档可能会更快,因为这样会减少文档碎片的可能性。你的实际更新代码是什么?@Cameron-希望每秒钟插入近30-40k个second@WesFreeman-我在上面写了一些代码,也许你想要一些正在使用bson代码too@stackmate:当您只想每秒更新一次文档时,为什么需要每秒30-40k次插入?每秒更新一次听起来很合理。也许您可以发布一些代码?此外,每秒创建一个新文档可能会更快,因为它会减少文档的潜在碎片。您的actu是什么al更新代码?@Cameron-希望每分钟插入近30-40k个second@WesFreeman-我在上面放了一些代码,也许你想用bson代码too@stackmate:当您只想每秒更新一次文档时,为什么需要每秒30-40k次插入?虽然这不是问题的根源,但非常有用。我的问题是他设置了write_问题。这意味着API正在等待mongo的响应,在继续之前说一切正常。这将使插入每次延迟约700ms。虽然这不是问题的根源,但非常有用。我的问题是write_问题被设置为开。这意味着API正在等待响应来自mongo
#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;
}