首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在node.js中,fs.createReadStream与fs.readFile的优缺点是什么?

在node.js中,fs.createReadStream与fs.readFile的优缺点是什么?
EN

Stack Overflow用户
提问于 2011-01-04 08:46:43
回答 3查看 34.2K关注 0票数 75

我正在和node.js打交道,我发现了两种读取文件并通过网络发送它的方法,一旦我确定它存在并用writeHead发送了正确的MIME类型:

代码语言:javascript
复制
// read the entire file into memory and then spit it out

fs.readFile(filename, function(err, data){
  if (err) throw err;
  response.write(data, 'utf8');
  response.end();
});

// read and pass the file as a stream of chunks

fs.createReadStream(filename, {
  'flags': 'r',
  'encoding': 'binary',
  'mode': 0666,
  'bufferSize': 4 * 1024
}).addListener( "data", function(chunk) {
  response.write(chunk, 'binary');
}).addListener( "close",function() {
  response.end();
});

如果文件很大,比如视频,那么fs.createReadStream可能会提供更好的用户体验,这样的假设对吗?感觉它可能不那么分块;这是真的吗?有没有其他我需要知道的优点、缺点、注意事项或陷阱?

EN

回答 3

Stack Overflow用户

发布于 2011-01-04 12:28:46

正如您所指出的,fs.readFile会将整个文件加载到内存中,而as fs.createReadStream会按您指定的大小读取文件。

客户端还将开始使用fs.createReadStream更快地接收数据,因为它是在读取数据时以块的形式发送出去的,而as fs.readFile将读取整个文件,然后才开始将其发送到客户端。这可能可以忽略不计,但如果文件非常大且磁盘速度很慢,则可能会有所不同。

但是想一想,如果你在一个100MB的文件上运行这两个函数,第一个函数将使用100MB内存来加载文件,而后者最多只使用4KB。

编辑:我真的看不出你为什么要使用fs.readFile,特别是因为你说过你要打开大文件。

票数 45
EN

Stack Overflow用户

发布于 2017-04-18 16:42:51

如果它是一个大文件,那么"readFile“将占用内存,因为它缓冲了内存中的所有文件内容,并可能挂起您的系统。而ReadStream则以块为单位读取。

运行此代码并观察任务管理器的性能选项卡中的内存使用情况。

代码语言:javascript
复制
 var fs = require('fs');

const file = fs.createWriteStream('./big_file');


for(let i=0; i<= 1000000000; i++) {
  file.write('Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n');
}

file.end();


//..............
fs.readFile('./big_file', (err, data) => {
  if (err) throw err;
  console.log("done !!");
});

实际上,您不会看到“完成!!”消息。"readFile“将无法读取文件内容,因为缓冲区不够大,无法容纳文件内容。

现在,使用readStream代替"readFile",并监控内存使用情况。

注意:代码取自Pluralsight上的Samer buna Node课程

票数 4
EN

Stack Overflow用户

发布于 2012-08-31 02:31:26

另一件事可能不太为人所知,那就是我认为与fs.createReadStream相比,Node在使用fs.readFile之后更善于清理未使用的内存。您应该对此进行测试,以验证哪种方法效果最好。此外,我知道每一个新版本的Node,这都会变得更好(即垃圾收集器在这些类型的情况下变得更智能)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4589732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档