sql >> データベース >  >> NoSQL >> MongoDB

100万レコードをmongodbに非同期で保存するにはどうすればよいですか?

    次の反復に進む前に非同期呼び出しが完了するのを待っていないため、爆発しました。これが意味するのは、これが問題を引き起こすまで、未解決の操作の「スタック」を構築しているということです。このサイトの名前は何ですか?写真を入手しますか?

    したがって、これは"Bulk" を続行するための最良の方法ではありません。 挿入。幸い、前述のコールバックの問題は別として、基盤となるMongoDBドライバーはすでにこれについて考えています。実際には、 "BulkAPI" があります。 これをずっと良くするために利用できます。そして、すでにネイティブドライバーをdbとしてプルしたと仮定します 物体。しかし、私は.collectionを使用することを好みます モデルからのアクセサー、および "async" すべてを明確にするモジュール:

    var bulk = Model.collection.initializeOrderedBulkOp();
    var counter = 0;
    
    async.whilst(
      // Iterator condition
      function() { return count < 1000000 },
    
      // Do this in the iterator
      function(callback) {
        counter++;
        var model = buildModel(counter);
        bulk.insert(model);
    
        if ( counter % 1000 == 0 ) {
          bulk.execute(function(err,result) {
            bulk = Model.collection.initializeOrderedBulkOp();
            callback(err);
          });
        } else {
          callback();
        }
      },
    
      // When all is done
      function(err) {
        if ( counter % 1000 != 0 ) 
            bulk.execute(function(err,result) {
               console.log( "inserted some more" );
            });        
        console.log( "I'm finished now" ;
      }
    );
    

    違いは、スタックを構築するだけでなく、完了時に両方の「非同期」コールバックメソッドを使用することと、1000エントリのバッチ更新ステートメントですべてを送信することによって非同期書き込み呼び出しを軽減するために「BulkOperationsAPI」を使用することです。

    これは、独自のサンプルコードのように関数実行の「スタックを構築」するだけでなく、すべてを個別のステートメントで送信するのではなく、サーバーコミットメントのために管理可能な「バッチ」に分割することにより、効率的な「ワイヤー」トランザクションを実行します。 。



    1. C#ドライバーからdb.currentOp()を取得する方法-mongodb

    2. Go:mongodbデータベースにログを記録するためのio.Writerインターフェースを作成します

    3. 監視する必要のある6つの重要なRedisモニタリングメトリクス

    4. Stackexchange.Redisでのパイプラインとバッチ処理