Javascript 为什么我们更喜欢使用createReadStream而不是readFile来为nodejs中的静态文件提供服务器?
摘自:《Nodejs在行动》一书 为什么将数据分块读取和发送是一个好主意,而不是使用“readFile”一次传递所有内容Javascript 为什么我们更喜欢使用createReadStream而不是readFile来为nodejs中的静态文件提供服务器?,javascript,node.js,Javascript,Node.js,摘自:《Nodejs在行动》一书 为什么将数据分块读取和发送是一个好主意,而不是使用“readFile”一次传递所有内容 为什么我们更喜欢使用createReadStream而不是readFile来为nodejs中的静态文件提供服务器?因为readFile方法一次将文件读取到内存中,因此占用了更多内存(因为文件可能非常大)。另一方面,createReadStream仅对其读取的当前块使用内存。通过这种方式,您可以使用相对较少的RAM操作大型文件。换句话说,使用createReadStream更节
为什么我们更喜欢使用
createReadStream
而不是readFile
来为nodejs中的静态文件提供服务器?因为readFile
方法一次将文件读取到内存中,因此占用了更多内存(因为文件可能非常大)。另一方面,createReadStream
仅对其读取的当前块使用内存。通过这种方式,您可以使用相对较少的RAM操作大型文件。换句话说,使用createReadStream
更节省内存。因为readFile
方法一次将文件读取到内存中,因此占用更多内存(因为文件可能非常大)。另一方面,createReadStream
仅对其读取的当前块使用内存。通过这种方式,您可以使用相对较少的RAM操作大型文件。换句话说,使用createReadStream
内存效率更高。请查看此答案
正如您所指出的,fs.readFile将把整个文件加载到内存中,而as.createReadStream将按您指定的大小读取文件
客户端还将使用fs.createReadStream更快地接收数据,因为在读取数据时数据会以块的形式发送,而as fs.readFile将读取整个文件,然后才开始将其发送到客户端。这可能可以忽略不计,但如果文件很大且磁盘速度较慢,则可能会产生影响
考虑一下,如果在100MB文件上运行这两个函数,第一个函数将使用100MB内存加载文件,而后者最多只使用4KB
编辑:我真的不明白你为什么要使用fs.readFile,特别是因为你说你将打开大文件。
克里斯蒂安·朱德利
看看这个答案
正如您所指出的,fs.readFile将把整个文件加载到内存中,而as.createReadStream将按您指定的大小读取文件
客户端还将使用fs.createReadStream更快地接收数据,因为在读取数据时数据会以块的形式发送,而as fs.readFile将读取整个文件,然后才开始将其发送到客户端。这可能可以忽略不计,但如果文件很大且磁盘速度较慢,则可能会产生影响
考虑一下,如果在100MB文件上运行这两个函数,第一个函数将使用100MB内存加载文件,而后者最多只使用4KB
编辑:我真的不明白你为什么要使用fs.readFile,特别是因为你说你将打开大文件。
克里斯蒂安·朱德利
var server = http.createServer( function( req, res )
{
var url = parse( req.url);
var path = join( root, url.pathname);
var stream = fs.createReadStream( path);
stream.on( 'data', function( chunk)
{
res.write( chunk);
});
stream.on( 'end', function()
{
res.end();
});
});