0

ときどき、以下のようにパフォーマンスが最悪になる可能性のあるコードを書いて、自分自身を驚かせます。コードは、ディレクトリ内のすべてのファイル (ファイルはテキストのみ) を読み取り、1/10 秒の間隔で各ファイルの各行をコンソールに出力するだけです。以下のアプローチでは、ファイルに 100 万行ある場合、100 万の setTimeout 関数が定義されます。1/10 秒ごとに 1 つの setTimeout がそれぞれの関数を呼び出します。以下のコードがパフォーマンスにどのように影響するのか興味がありましたか? nodejs env で何百万ものコールバックを定義しても問題ありませんか? 以下のコードについてどう思いますか。

 function scanDir(dir){
            fs.readdir(dir , function(err , list){
                var interval = 0;
                list.forEach(function(file, index){
                    lineReader.eachLine(dir + "/" + file, function(line, last) {
                     interval += 100;
                      (function(line){
                         setTimeout(function(){
                         console.log(line+"\n\r");
                         },interval)
                      })(line);

                      if (last) {
                        return false; // stop reading
                      }
                    });
                })
            })
    }
4

1 に答える 1

1

何百万ものコールバックを定義することはできません。約12,000かそこら後に、コールスタックのスペースが不足します。これはあなたが得るエラーです:

RangeError: Maximum call stack size exceeded

これで、本当に必要な場合は、次のコマンドライン引数を使用して呼び出しスタックのサイズを増やすことができますが、何百万ものコールバックをサポートすることはないと思います。

node --max-stack-size=val

何を達成しようとしているのかを本当に理解していなければ、コードの追加の改善を提案することは困難です。本当に100万行ある場合、行の印刷には1/10秒ごとに1日以上かかるのに、なぜこれを実行したいのでしょうか。

于 2012-09-29T04:16:26.607 に答える