2

これは、時間がかかりすぎたため、最適化とプロファイリングに過去 2 日間を費やしたコードの一部です。

{
    mongo::ScopedDbConnection _dbConnection (DbHost);
    _dbConnection->insert(TokensDB, tokensArray );
    _dbConnection.done();
}

{
    mongo::ScopedDbConnection _dbConnection (DbHost);   
    _dbConnection->insert(IdxDB, postingsArray);
    _dbConnection.done();
}

ここpostingsArraystd::vector<BSON (int64_t, int64_t, int64_t, int)>、20 000 要素があります。この挿入には常に数ミリ秒しかかかりません。tokensArraystd::vector<BSON (int64_t, std::string)>、5000要素です。これは奇妙な挿入物です。

上記のコード フラグメントとまったく同じように実行すると、45 ~ 50 ミリ秒かかります。しかし、最初と同じように 2 つのブロックを切り替えると (IdxDB最初とTokensDB2 番目に挿入)、400 ~ 500 ミリ秒かかります。ここで何が起こっているのですか?なぜ順序が重要なのですか?5000 の 2 フィールド レコードを挿入すると、20k の 4 フィールド オブジェクトを挿入するよりも時間がかかるのはなぜですか?

私の最初のアイデアは、std::stringフィールドが原因であるということです(単一の英単語を保持するため、平均して約5〜7記号です)。乱数に置き換えましたint64_t-挿入完了時間に目立った変化はありません。

すべてのプロファイリングはクリーンなデータベースで行われ、毎回まったく同じデータが使用されます。測定値を整理するのは私の間違いではないと思います。

4

1 に答える 1

2

MongoDB はバックグラウンドで多くのことを実行するため、大規模な挿入にpostingsArray時間がかかるのは正常ですが、その後のパフォーマンスに影響します。挿入を単独で測定postingsArrayすると、MongoDB ドライバーが挿入を受け入れるのにかかる時間のみが測定されます。しかし、その後の操作を測定すると、挿入によって開始されたバックグラウンド ワークロードに気付き始めますpostingsArray
ポイント 6 を参照してください: http://article.gmane.org/gmane.comp.db.mongodb.user/818

ところで、あなたの例を書いた方法では、MongoDB が挿入に対して同じ接続を提供すると思われます。(たとえば、プールから接続を取得し、接続を挿入しpostingsArrayて解放し、プールから同じ接続を再度取得して接続を挿入するtokensArray場合があります)。その場合、TCP/IP ソケットはまだpostingsArray挿入でビジーであり、TCP/IP バッファの制限に達している可能性があります。

PSMongoDBが挿入を実行するのにかかる実際の時間を測定するために、書き込みの懸念を変更することをお勧めします: http://article.gmane.org/gmane.comp.db.mongodb.user/68288

于 2013-02-04T13:28:54.587 に答える