📜  Node.js 流 readable.readableHighWaterMark 属性(1)

📅  最后修改于: 2023-12-03 15:03:15.481000             🧑  作者: Mango

Node.js 流 readable.readableHighWaterMark 属性

在 Node.js 中,可以通过 Stream 构建各种可读、可写流,它们是处理流数据的重要基础。在可读流中,readable.readableHighWaterMark 属性是一个非常重要的配置项,本文就来详细介绍一下它的作用和用法。

可读流的高水位标记

在可读流中,高水位标记是指一个阈值,当已经被读取的数据大小达到该阈值时,流会触发 readable 事件,通知消费者可以再次读取数据。详细来说,如果可读流的缓存数据大小达到了高水位标记,那么消费者就需要尽快读取数据,否则可读流会停止读取数据,等待缓存中的数据被处理掉,以避免缓存过大导致内存占用过多。

因此,设置合适的高水位标记对于可读流的性能和内存使用是非常重要的。

readable.readableHighWaterMark 属性的用法

要设置可读流的高水位标记,我们需要在创建可读流的时候传入配置对象,并在该对象中设置 highWaterMark 属性,其值为期望的高水位标记值,例如:

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

const readable = fs.createReadStream('/path/to/file', {
  highWaterMark: 1024 // 设置高水位标记为 1KB
});

在上面的代码中,我们使用 fs.createReadStream 创建了一个可读流,并将 highWaterMark 属性设置为 1024,即 1KB。这意味着消费者需要尽快读取数据,以免缓存中的数据过多占用内存。

可读流的默认高水位标记

在 Node.js 中,可读流的 highWaterMark 默认值是 16KB,这意味着第一次读取数据时会读取 16KB 的数据,并且当缓存中数据大小超过了 16KB 时,就会触发 readable 事件通知消费者需要尽快读取数据。

如果我们使用大型文件或者网络流作为数据源,那么默认的高水位标记可能会导致内存占用过多,此时我们就需要将 highWaterMark 属性设置为合适的值来避免这种情况的发生。

注意事项
  • 设置 highWaterMark 属性时要注意,该值应该尽可能地小,以便尽早地释放内存。同时,也不要设置太小,以免需要太频繁地读取数据,降低性能。
  • 如果需要使用大型文件或者网络流作为数据源,建议将 highWaterMark 设置为比较小的值,例如 1KB 或者更小的值,这可以有效避免内存占用过多的问题。
  • 如果可读流的数据源已经是节流的,也就是说无论 highWaterMark 值如何都没有效果,因此不需要设置此属性。
结论

readable.readableHighWaterMark 属性是可读流中的一个重要配置项,适当设置该属性可以有效提高可读流的性能,避免内存占用过多问题的发生。合理设置 highWaterMark 属性需要结合实际情况,考虑数据源的特点、消费者的处理能力等因素。