0

簡単に言うと、時系列データをドキュメントに保存する必要があります。私は、30分間のデータを担当するドキュメントを持つことが合理的であると判断しました。ドキュメントは次のようになります。

しかし、これは毎秒更新される約数百/千のドキュメントの1つにすぎません。

{
    _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。次に、毎秒、タイムスタンプと値の組み合わせを追加したいと思います。

私はmongocライブラリを使用しています。これは超高速であると想定していましたが、これを実行する方法には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 に答える