0

很简单,我需要将时间序列数据存储在文档中。我认为有一份负责 30 分钟数据的文件是合理的。该文档可能如下所示:

但这只是每秒将更新的大约几十万个文档中的一个。

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

    // and so on
 }

这意味着每 30 分钟,我使用_idfield1创建文档field2。然后,每一秒我都想添加一个时间戳/值组合。

我正在使用 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
}

关闭或打开注销关注没有任何区别。

4

2 回答 2

2

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

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

于 2012-08-16T20:02:50.270 回答
1

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

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;
}
于 2015-11-11T13:09:50.327 回答