2

node-dirtyのコードを調べていて、ファイルに大量のデータを書き込むときに、元のプログラマーが書き込みを複数のグループにまとめて、グループの書き込みを一度に1つずつ発行することを選択したことに気付きましたが、コールバックを待たずに、すべてが1つのループの一部として同時に発行されます。これについて3つの質問があります。解決すべき同様の問題があります。

  1. これは何らかの方法でより効率的ですか?書き込みもバンドルする必要がありますか?
  2. 最適なバンドルサイズをどのように選択すればよいですか?なぜ1つのグループを書いてみませんか?
  3. 書き込みストリームでon('drain')イベントにサインアップした場合、同時に発行されたすべての書き込みが完了した後に1回だけ発行されますか?またはそれぞれの後に?(私の推測は前者です)
  4. on('error')が発行された場合、('drain')イベントも発行されますか?それとも、それらは相互に排他的ですか?

ありがとう

4

2 に答える 2

2

これは何らかの方法でより効率的ですか?書き込みもバンドルする必要がありますか?

小さな書き込みをたくさん行うのは非効率的です。書き込みコマンドを送信すると、オーバーヘッドが発生します。したがって、1000バイトではなく5バイトだけを書き込む方がコストがかかります。

最適なバンドルサイズをどのように選択すればよいですか?なぜ1つのグループを書いてみませんか?

最適なサイズは、私には黒い芸術のように聞こえます。私はそれを1つの大きな書き込みにしないことには正当な理由があると思います。おそらく、早くから後で書き始めるでしょう。少し早く開始する方が少し効率的です。

書き込みストリームでon('drain')イベントにサインアップした場合、同時に発行されたすべての書き込みが完了した後に1回だけ発行されますか?またはそれぞれの後に?(私の推測は前者です)

書き込みキュー内のすべてが書き込みを終了すると、ドレイントリガーがトリガーされます。したがって、書き込みキューに書き込みよりも速く追加する限り、トリガーは1回だけにする必要があります。そのようなエッジケースを引っ張るには、システムの1つの地獄が必要になります。

on('error')が発行された場合、('drain')イベントも発行されますか?それとも、それらは相互に排他的ですか?

放出されたとしても、「ドレイン」でエラー処理を行うことは意味がありません。エラーが発生した場合、書き込み操作全体が失敗したと常に想定し、書き込みの途中で回復しようとはしません。

于 2011-04-21T20:30:32.790 に答える
0

4.の場合、on('error')が発行された場合、('drain')イベントも発行されますか?それとも、それらは相互に排他的ですか?

アプリケーションの状態を正しく維持したくないので、心配しています。したがって、便利な関数を使用できるかもしれません。

function not_if(proc, veto_inner) {
  var vetoed = false;
  return {
    proc: function() {
      if (!vetoed) { return proc.apply(null, arguments); }
    }, 
    vetoer: function() {
      if (!vetoed) {
        vetoed = true;
        veto_inner.apply(null, arguments);
    }
  };
}

これで、「error」ハンドラーをvetoerに、「drain」ハンドラーを「proc」に設定でき、「error」が呼び出された後に「drain」が呼び出されることを心配する必要はありません。

于 2011-04-21T21:08:07.457 に答える