fs.createRead/WriteStream() 与 fs.promises.open()

Ale*_*lex 3 javascript file-io node.js

其中哪一个更适合在文件管理器类型的节点服务器应用程序中处理文件读/写操作?

一个比另一个快吗?速度非常重要,因为该应用程序应该能够同时处理多个用户请求

小智 5

流的独特之处在于,流不是像传统方式那样将文件一次性全部读入内存,而是逐段读取数据块,处理其内容而不将其全部保留在内存中。

\n

这使得流在处理大量数据时非常强大,例如,文件大小可能大于可用内存空间,从而无法将整个文件读入内存以进行处理。那\xe2\x80\x99s 就是流来救援的地方!

\n

使用流处理较小的数据块,可以读取较大的文件。

\n

与其他数据处理方法相比,流基本上具有两个主要优点:

\n
    \n
  1. 内存效率:在处理大量数据之前,您不需要将其加载到内存中
  2. \n
  3. 时间效率:一旦获得数据就开始处理数据所需的时间显着减少,而不必等到整个有效负载传输完毕才进行处理
  4. \n
\n


小智 5

其中哪一个更适合处理文件管理器类型的节点服务器应用程序中的文件读/写操作?

两者都可用于节点服务器应用程序。但是node中HTTP实现的请求响应都是基于流的,这意味着基于流的方式在处理大的I/O操作方面更加灵活。

一个比另一个快吗?速度非常重要,因为应用程序应该能够同时处理多个用户请求。

有强有力的证据表明流在内存使用和时间方面更好。我将从Node.js 设计模式 - 第二版中借用一些示例:掌握构建模块化和可扩展服务器端 Web 应用程序的最佳实践第 5 章 - 使用流编码

缓冲方法:

const fs = require('fs');
const zlib = require('zlib');

const file = process.argv[2];

fs.readFile(file, (err, buffer) => {
  zlib.gzip(buffer, (err, buffer) => {
    fs.writeFile(file + '.gz', buffer, err => {
      console.log('File successfully compressed');
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

结果将是正常的,但是当尝试使用超过 1GB 的文件时。我们会遇到这个错误。

RangeError: File size is greater than possible Buffer: 0x3FFFFFFF bytes
Run Code Online (Sandbox Code Playgroud)

使用流方法的相同文件:

RangeError: File size is greater than possible Buffer: 0x3FFFFFFF bytes
Run Code Online (Sandbox Code Playgroud)

想象一下,如果一个节点进程必须同时处理 100 个请求,每个请求尝试上传的文件大小高达 100MB。这个 node.js 进程只是将文件二进制文件的所有缓冲区保存在内存中,您的服务器只会遭受内存泄漏。

为了时间效率,stream帮助了chunk处理的数据,所以它肯定会提高速度

缓冲区与流处理

免责声明:大部分示例和图像来自Node.js 设计模式 - 第二版 - 第 5 章,我不拥有任何这些材料,仅用于教育目的。