管道与缓冲以上传节点中的文件

时间:2014-02-03 21:37:26

标签: javascript node.js

据我所知,有两种规范方法可以用Node.js中的文件进行响应:

首先,我确定最常见的方法是将文件加载到内存中并转发回调的数据参数。例如:

if(stat && stat.isFile()){
    fs.readFile(d,function(a,data){
        response.writeHead(200,{
            'Content-Type': 'text/plain'
        });
        response.write(data);
        successCallback();
    })
}

此外,还有一种方法可以在读取数据时对其进行管道传输。例如:

var filePath = path.join(__dirname, 'myfile.mp3'),
    stat = fileSystem.statSync(filePath),
    readStream = fileSystem.createReadStream(filePath);

response.writeHead(200, {
    'Content-Type': 'video/mp4',
    'Content-Length': stat.size
});
readStream.pipe(response);

现在,显然后一种方法在内存保护方面有明显优势,特别是考虑到大文件或流。然而是最好的全能方法吗?在我处理(相对)小而大量的文件(如HTML,脚本和位图)的情况下,我最好使用前者,教科书方法?

因此,对于所有意图和目的,幕后发生了什么,以及间接开销可能会阻止我一直使用readStream,如果有的话?

1 个答案:

答案 0 :(得分:1)

分别阅读fs.readFilefs.createReadStream的来源,我会说createReadStream()是更好的全能方法。无论大小如何,仍然必须从磁盘读取数据。但是,如果数据很大,则会有一个性能/资源命中分配缓冲区内存以在发送之前存储它。

ReadStream中的{p> node已经过优化,速度很快 - 它用于http响应以及node如此着名的请求。

在您不断重复发送有限数量的较小文件的特定情况下,缓存数据具有优势。然后,您将在应用程序启动中读取readFile的所有文件,将它们存储在哈希中,并在每次请求时直接从内存中发送它们。如果你可以节省内存,那么在请求周期中避免文件系统的总是最快的。

但作为一般规则,尽管将数据传输到客户端而没有中间存储器存储。