2

私は Web 開発を始めたばかりで、node.js + Express は、それほど強力ではない組み込みシステムで単純なサーバーをすばやく起動するのに役立ちました。ただし、270MB のディレクトリを tarfile として提供しようとすると、私のソリューションではパフォーマンスがまったく良くありません。

irc のヘルプを取得した後、次のように fstream と node-tar を使用してファイルを提供してみました。

fstream.Reader({ type: "Directory" , path: mydir }).pipe(tar.Pack({})).on("error", function(){ res.statusCode = 500; res.end('Unable to create tarball'); }).pipe(res)

動作しますが、270MB のファイルを PC にダウンロードするのに約 20 分かかります。実験として、ターゲット上のフォルダーを tar し、それを scp して自分の PC に送信してみました。これには 1 分 12 秒 + 2 分 17 秒かかりました。これは非常に大きな違いです。

(node-staticを使用して事前にtarされたファイルを提供しようとしましたが、組み込みシステムでメモリが不足しました)

express+node.js-solution が非常に遅くなる理由は何ですか?

いくつかのベンチマークで更新します。

別の Web サーバーを使用した方が静的ファイルの提供には適していると思いますが、ここでの大きな違いを説明できるとは思いません。

64MB の tar になるフォルダで実行されたベンチマーク

マニュアル
46秒

# on server:
tar -cf foo.rar <folder>  
# on client
scp root@<ip>/path/to/foo.rar . 

fstream + node-tar: 直接
4 分 25 秒

fstream.Reader({type: "Directory", path: dir}).pipe(tar.Pack({})).on("error", function(){res.statusCode = 500; res.end('Unable to create tarball');}).pipe(res);

fstream + node.tar: 最初にファイルにストリーミングし、次にファイルを提供する
1 分 11 秒

fstream.Reader({type: "Directory", path: dir}).pipe(tar.Pack({})).on("error", function(){res.statusCode = 500; res.end('Unable to create tarball');}).pipe(fstream.Writer('/tmp/test.rar').on("close", function() {
    var rs = fs.createReadStream('/tmp/test.rar');
    rs.on('data', function(data) {
        res.write(data);
    });
    rs.on('end', function() {
        res.end();
    });
}));
4

0 に答える 0