2

何千行ものログファイルを読み取り、各行を Mongo データベースに書き込む必要があります。ノードストリームを使用してファイルを読み込んでいます。「分割」npmパッケージを使用して、ファイルを「行」に分割しています。MongoDB の書き込みは、ネットワークの考慮事項により、ログファイルの読み取りよりもはるかに時間がかかります。

私のコアコードは次のようになります。

var readableStream = fs.createReadStream(filename);

            readableStream
                .pipe(split()) // This splits the data into 'lines'
                .on('data', function (chunk) {

                    chunkCount++;
                    slowAsyncFunctionToWriteLogEntryToDatabase(chunk); // This will take ages

                })
                .on('end', function () {
                    // resolve the promise which bounds this process
                    defer.resolve({v:3,chunkCount: chunkCount})

                });

キューに入れられる書き込みの数によって MongoDB システムが打撃を受けることを心配する必要はありますか? おそらく、ノード パイプ バックプレッシャー メカニズムは、多くの db 書き込みがキューに入れられていることを認識していないのでしょうか? ログファイルから次の行を読み取る前に、各 MongoDB 挿入が完了するのを待つように、読み取り可能なストリームを「遅く」する方法はありますか? 私は不必要に心配していますか?

4

2 に答える 2

2

pause()との作業以来、resume()いくつかの問題があるようです。Transform ストリームを使用する別のオプションを記述します。

var Transform = require('stream').Transform;

var myTransform = new Transform({
   transform(chunk, encoding, cb) {
      chunkCount++;

      syncFunctionToWriteLogEntryWithCallback( chunk, function() {
         cb();
      } );
  },

  flush(cb) {
      chunkCount++;
      syncFunctionToWriteLogEntryWithCallback( chunk, function() {
         cb();
      } );
  }
});

readableStream
        .pipe( split() )
        .pipe( myTransform );

変換ストリームを使用すると、ストリームの処理が終了するたびにコールバックを提供できます。

于 2016-11-24T17:32:23.990 に答える