私は 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();
});
}));