0

0

在 Node.js 中,如何创建一个可读写的双工流来处理大规模数据转换?

狼影

狼影

发布时间:2025-10-22 17:59:01

|

831人浏览过

|

来源于php中文网

原创

双工流可实现边读边写的数据转换,通过继承stream.Duplex并实现_write和_read方法,结合this.push推送处理后数据,适用于大文件处理等内存敏感场景。

在 node.js 中,如何创建一个可读写的双工流来处理大规模数据转换?

在 Node.js 中处理大规模数据转换时,使用双工流(Duplex Stream)可以有效控制内存占用,实现边读边写的数据处理。双工流同时具备可读流和可写流的特性,非常适合中间转换场景,比如数据压缩、编码转换或实时处理。

理解双工流的核心机制

双工流允许你一边接收输入(通过 _write 方法),一边产生输出(通过 _read 方法)。对于数据转换任务,通常你在写入端接收原始数据,在读取端推送处理后的数据。

关键点:

  • 继承 stream.Duplex
  • 实现 _write() 方法处理输入
  • 实现 _read() 方法提供输出
  • 使用 this.push() 将处理后数据送入可读端

创建自定义双工流进行数据转换

以下是一个将字符串转为大写并逐行处理的双工流示例:

// upperCaseTransform.js
const { Duplex } = require('stream');

class UpperCaseDuplex extends Duplex {
  constructor(options) {
    super(options);
    this.buffer = '';
  }

  _write(chunk, encoding, callback) {
    // 将接收到的数据拼接到缓冲区
    this.buffer += chunk.toString();
    
    // 按行分割处理
    const lines = this.buffer.split('\n');
    this.buffer = lines.pop(); // 保留未完整行

    lines.forEach(line => {
      this.push(line.toUpperCase() + '\n');
    });

    callback();
  }

  _read() {
    // 不需要主动读取,由写入触发
    // 可在此模拟生成数据,但通常依赖 _write 推送
  }
}

在实际场景中使用双工流处理大文件

结合文件流使用,可高效处理大文件而不加载全部内容到内存:

笔尖Ai写作
笔尖Ai写作

AI智能写作,1000+写作模板,轻松原创,拒绝写作焦虑!一款在线Ai写作生成器

下载
const fs = require('fs');
const upperStream = new UpperCaseDuplex();

// 读取大文本文件,转换后写入新文件
const readStream = fs.createReadStream('large-input.txt');
const writeStream = fs.createWriteStream('output-uppercase.txt');

readStream.pipe(upperStream).pipe(writeStream);

writeStream.on('finish', () => {
  console.log('数据转换完成');
});

这种方式适用于日志处理、ETL 流水线、编码转换等场景。每一块数据被逐步处理,内存始终保持在可控范围。

优化与注意事项

为了提升性能和稳定性,注意以下几点:

  • 合理设置 highWaterMark 控制缓存大小
  • _write 中及时调用 callback 避免阻塞
  • 复杂转换可结合 Transform 流(更简洁的选择)
  • 错误处理:在 _write_read 中抛错会触发 error 事件

基本上就这些。双工流提供了灵活的数据通道,适合构建可复用的数据处理中间件。只要把握好读写节奏和缓冲逻辑,就能稳定处理任意规模的数据流。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

178

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

213

2025.12.18

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

188

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

288

2023.10.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

278

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1489

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

621

2023.11.24

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

5

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.4万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号