Mongodb Mongo C驱动程序,尽快更新文档
非常简单,我需要将时间序列数据存储在文档中。我已经决定,让一个文档负责30分钟的数据周期是合理的。文档可以如下所示: 但这只是每秒更新的几百/千份文档中的一份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分
{
_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;
}