Express + node.js:作为tar打包的大型目录的速度很慢

时间:2012-08-14 20:20:12

标签: node.js express

我刚开始玩网络开发,而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文件下载到我的电脑需要大约20分钟。作为一个实验,我尝试将目标上的文件夹命名为tar,然后将其压缩到我的PC上。这需要1m12s + 2m17s,这是一个很大的不同。

(我尝试使用node-static提供pre-tar'ed文件,但我的嵌入式系统内存不足)

有什么想法可以使express + node.js-solution这么慢?

使用一些基准测试进行更新:

我怀疑使用其他网络服务器对于静态文件服务会更好,但我认为它不能解释这里的重大差异。

对文件夹进行基准测试,产生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();
    });
}));

0 个答案:

没有答案