Kailang Blog

Node Stream 下载2020-11-12Θ

流(Stream)是 Node.js 中处理流数据的抽象接口。流模块提供用于实现流接口的 API。Node.js 中有许多流对象事例,比如:HTTP Requestprocess.stdout

Stream 大文件下载#

node 处理大文件下载的方式是创建一个 read stream 和一个 write stream 通过管道(pipe)的形式进行文件的下载。

request 方法会读入二进制片段到缓存中,然后通过 write stream 尽快写入到磁盘

single stream download image

流式下载可以保证不占用过大的内存,保证大文件稳定下载。但是单个下载只会占用机器小部分资源,如何充分利用机器资源优化下载呢?如果多个大文件下载,并发下载可以保证资源占用,单个大文件下载则可以指定分段下载,通过并发执行分段下载任务来充分利用资源。

大文件分段下载#

下载分段文件到本地,再合并成一个大文件#

通过 Range 对大文件进行分段,然后并发下载分段到本地,然后通过 Stream 将多个文件合并成一个大文件

多个小文件合并成一个大文件#

Stream 内存泄漏注意事项#

默认情况读写流执行完成后,会自动关闭,不会有内存泄漏问题。但是可以通过配置设置不自动关闭。

手动处理 Stream 关闭#

options 的 end 属性:读取结束时终止写入流,默认值是 true。

设置写流为 false,在结束时手动关闭。

如果发生异常错误,写入目标流将不会关闭,除非 kill 进程。需要监听错误异常,手动关闭写流,防止内存泄漏。