node stream 流(一)流的基本介绍及流下载文件
什么是流,为什么要使用流?之前对流的概念一直比较模糊。最近有时间好好的看了看关于流的知识,总算有了一个比较清晰的认识。
首先我们来看一下什么是流。
就我自己的观点来看,其实流就是在两个设备之间建立一个管道,然后通过管道将数据以流动的方式传输。如何来理解这个以流动的方式呢?
举个例子来说吧,当我们读取文件的时候,如果不使用流的方式读取的话,我们会将整个文件的内容先通过i/o设备写进内存,然后再由消费者去内存中读取。而使用流的方式是边将文件内容写入缓存边由消费者去读取,不用将整个文件先写进内存,从而节省了内存的空间。
不使用流的方式
当一个文件非常大的时候我们看到,不使用流的方式的话,占用的内存也是相当大的。这样就影响了响应的速度。对用户的体验也是有一定的影响的。
var http = require('http');
var fs = require('fs');
var server = http.createserver(function (req, res) {
fs.readfile(__dirname '/data.txt', function (err, data) {
res.writehead(200,{
'content-type': 'application/octet-stream',
'content-disposition': 'attachment; filename=data.txt',
'accept-length': 1024,
});
res.end(data);
});
}).listen(8000)
上面是一段文件下载的功能。要下载的文件假设500m的话,其内存占用如下
pid user pr ni virt res shr s %cpu %mem time command
5601 root 15 0 1212m 516m 9460 r 0.7 51.7 0:10.09 node
5643 root 15 0 12764 1116 836 r 0.3 0.1 0:00.47 top
下载一个500m的文件,上述方法会占用500多兆的内存。所以说我们应该尽量避免上述方式出现在我们代码中。
下面我们看流的方式读取文件
我们看使用流的方式的话,内存占用非常小,当然上面只是假定每次都是50m。经过测试内存使用情况流的方式平均是前者的十分之一。
其实上面流的过程我们可以这样理解
这就是我理解的流。
var http = require('http'); var fs = require('fs');
var server = http.createserver(function (req, res) {
res.writehead(200,{
'content-type': 'application/octet-stream',
'content-disposition': 'attachment; filename=data.txt',
'accept-length': 1024,
});
var stream = fs.createreadstream(__dirname '/data1.txt' );
stream.pipe(res)
}).listen(8000);
上面代码是使用流的方式来下载文件,其内存占用情况如下。
pid user pr ni virt res shr s %cpu %mem time command
5673 root 15 0 776m 49m 9992 s 7.3 5.0 0:04.47 node
5683 root 15 0 12764 1112 836 r 0.3 0.1 0:00.18 top
我们看到占用内存再50m左右。是不使用流的方式的十分之一。
至于为什么使用流,流的好处通过我们上面的例子我们也能看到,其最大的一个好处就是节省内存,提高程序的运行速度。通过上面两段文件下载的代码我们也能得到结论。除此之外node中的管道函数.pipe()(管道是流中一个非常重要的概念)还能根据消费者读取的速度通过阀门来控制写入的速度。
代码中在合适的地方加入流的使用,确能大大提高程序的性能。
转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处
本文地址:
相关文章
发布时间:2024/03/18 浏览次数:184 分类:javascript
-
本教程教授如何在 javascript 中为函数添加节流函数
解决 linux bash 中的 nodemon 命令未找到错误
发布时间:2024/03/14 浏览次数:223 分类:操作系统
-
本文介绍如何解决 linux bash 中的 nodemon command not found 错误。
在 c# 中将流转换为字节数组
发布时间:2024/01/20 浏览次数:294 分类:编程语言
-
有两种主要方法可用于将流转换为 c# 中的字节数组,即 stream.copyto()和 memorystream.toarray()函数。
发布时间:2024/01/16 浏览次数:182 分类:编程语言
-
stream.copyto()方法可用于将流写入 c# 中的文件。在 c# 中使用 stream.copyto() 方法将流写入文件
在 java 中将 stream 元素转换为映射
发布时间:2023/11/13 浏览次数:83 分类:java
-
我们将使用 java 将流元素转换为映射。我们将向你展示如何使用 collectors.tomap() 从 java 字符串中提取映射。我们将讨论 java streams 的实际用途以及如何将流元素转换为映射元素。
java 中的 findfirst 流方法
发布时间:2023/11/13 浏览次数:265 分类:java
-
本教程介绍 java 中的 findfirst 流方法。java.util.stream api 是在 java 8 中引入的;它用于处理对象的集合。不同的源(例如数组或集合)可以创建流。
java 中的 stream 的 reduce 操作
发布时间:2023/11/13 浏览次数:176 分类:java
-
本文介绍 java 中 stream 的 reduce 操作。本文将讨论 reduce() 操作细节并讨论它的一些示例。在讨论 reduce() 操作之前。让我们首先讨论减少。
发布时间:2023/10/18 浏览次数:138 分类:java
-
本文介绍 java 中的流 api 及其过滤方法。本教程介绍 java 中的流 api 及其 filter() 方法。在 java 中,流是对象的集合。
在 java 中使用 stream.orted() 对列表进行排序
发布时间:2023/10/17 浏览次数:77 分类:java
-
本文介绍了如何在 java 中使用 stream sorted() 方法。这也演示了如何使用比较器对用户定义的列表进行流排序。本教程将详细介绍 java 中的 stream api 提供的 stream sorted() 方法。