Javascript 为什么我们更喜欢使用createReadStream而不是readFile来为nodejs中的静态文件提供服务器?

Javascript 为什么我们更喜欢使用createReadStream而不是readFile来为nodejs中的静态文件提供服务器?,javascript,node.js,Javascript,Node.js,摘自:《Nodejs在行动》一书 为什么将数据分块读取和发送是一个好主意,而不是使用“readFile”一次传递所有内容 为什么我们更喜欢使用createReadStream而不是readFile来为nodejs中的静态文件提供服务器?因为readFile方法一次将文件读取到内存中,因此占用了更多内存(因为文件可能非常大)。另一方面,createReadStream仅对其读取的当前块使用内存。通过这种方式,您可以使用相对较少的RAM操作大型文件。换句话说,使用createReadStream更节

摘自:《Nodejs在行动》一书

为什么将数据分块读取和发送是一个好主意,而不是使用“readFile”一次传递所有内容


为什么我们更喜欢使用
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();
                    });
        });