1

ドキュメントの束を 1 つのコレクションに挿入すると、cron ジョブがそれらを別のコレクションに移動します。

私がこれを行う理由は、データを高速に保存する必要があるインデックスのないコレクションがあり、2 番目のコレクションはインデックスが作成されているため、挿入が遅いため、cron ジョブがデータを移動するためです。

次のスクリプトを使用してデータを移動します

db.smalldaily.find().forEach(function(doc){db.largedaily.save(doc);db.smalldaily.remove(doc);});

問題は、データの移動が完了した直後です。mongod がクラッシュしたようです。mongo シェルにログインして db.large と入力し、TAB ボタンを押してコレクション名を自動補完すると、mongodb が昏睡状態になり、必要があります。 mongod サービスを再起動して機能させます。

私は何か間違ったことをしていますか、それともmongodbがまだ未熟であるという噂は部分的に真実ですか?

CentOS で MongoDB シェル バージョン 2.2.1 を使用しています。

4

1 に答える 1

3

したがって、これは基本的にサーバー側の JavaScript として実行されforEach、100 万以上のドキュメントを反復処理するシェルで大規模なループを作成します。これが実行されている間、(マップされていない) メモリの量が非常に高くなると思います。

代わりにドライバーを使用してシェルの外部でこれを実行した場合、問題はまったく発生しない可能性があります。移行が完了しても、メモリはクリーンアップされませんか? もしそうなら、それはおそらく問題です。

次のリリース (2.3+) では、シェルのパフォーマンスを大幅に向上させるための変更が予定されていますが、現時点では、シェル内で内部的に行うのではなく、ドライバーを介してこれを行う方がよいでしょう。1つには、一度に 1 つずつ反復するよりも、バッチでこれを行う方がすぐに効率的です。

とはいえ、これが簡単に再現でき、特にデータセットの例を提供できれば、開発者がこのループを処理するときにシェルがなぜバーフィングを行っているのかを理解できるように、バグレポートの絶好の材料になります。

于 2012-11-14T04:51:33.043 に答える