当前位置: 首页 > news >正文

Node.JS CreateWriteStream(大容量写入文件流优化)

Why I Need Node.JS Stream

如果你的程序收到以下错误,或者需要大容量写入很多内容(几十几百MB甚至GB级别),则必须使用Stream文件流甚至更高级的技术。

Error: EMFILE, too many open files

业务场景,我们有一个IntradayMissingRecord的补全功能,每天大概是80-100W级别,如果需要在几分钟内把这么多记录写入到文件,需要根据某incremental逻辑去加载当天/当时间段所有记录,并且遍历并写入到一个文件中,这个时候createWriteStream可以更好的优化。

而且个人更推荐设置autoClose:true的设置,那么文件流系统会自动在内容写入之后和退出方法之后进行关闭。

What's Node.JS Stream?

首先,Stream (流,通常指文件流)是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。

Node.js,Stream 有四种流类型:

  • Readable - 可读操作。

  • Writable - 可写操作。

  • Duplex - 可读可写操作.

  • Transform - 操作被写入数据,然后读出结果。

所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:

  • data - 当有数据可读时触发。

  • end - 没有更多的数据可读时触发。

  • error - 在接收和写入过程中发生错误时触发。

  • finish - 所有数据已被写入到底层系统时触发。

CreateWriteStream Parameter

/*
@params:path指定文件的路径
@params:options可选,是一个JS对象,可以指定一些选项如:
let option={
              flags: 'w',//指定用什么模式打开文件,’w’代表写,’r’代表读,类似的还有’r+’、’w+’、’a’等
              encoding: 'utf8',//指定打开文件时使用编码格式,默认就是“utf8”,你还可以为它指定”ascii”或”base64”
              fd: null,//fd属性默认为null,当你指定了这个属性时,createReadableStream会根据传入的fd创建一个流,忽略path。另外你要是想读取一个文件的特定区域,可以配置start、end属性,指定起始和结束(包含在内)的字节偏移
              mode: 0666,//通常不建议修改
              autoClose: true//autoClose属性为true(默认行为)时,当发生错误或文件读取结束时会自动关闭文件描述符
          }

Show Me The Code

const fs = require('fs')//by zhengkai.blog.csdn.net
async function main() {let datax = "XXXX"const writeStreamFile = fs.createWriteStream('stream.txt', {flags: 'w',encoding:'utf-8',autoClose:true});//write first linewriteStreamFile.write(datax);datax=""for (let index = 0; index < 100000; index++) {datax=index+"___"writeStreamFile.write(datax);}}try {main()} catch (err) {console.error('###### global err', err)}

Result

http://www.lryc.cn/news/287062.html

相关文章:

  • 安卓开发之自动缩放布局
  • DDD系列 - 第9讲 实体、值对象
  • 5分钟做自己的微信红包封面
  • pytorch中BCELoss 和 binary_cross_entropy_with_logits之间的区别
  • 无刷电机学习-方波电调 程序篇1(AM32)
  • 如何自己制作一个属于自己的小程序?
  • HTML 入门手册(二)
  • 零基础学Python(5)— 基本数据类型
  • centos7安装Redis7.2.4
  • certificate-transparency-go用例
  • 前端上传大文件使用分片上传
  • Kotlin 解构声明
  • 基于若依的ruoyi-nbcio流程管理系统一种简单的动态表单模拟测试实现(四)
  • 遗传算法原理详细讲解(算法+Python源码)
  • Linux文本处理指令汇总
  • Prompt Engineering
  • Ansible剧本playbooks
  • Excel·VBA时间范围筛选及批量删除整行
  • Map转成String,String 转换成Map
  • 分享一个剧本(改编自我)
  • 结合Tensuns管理prometheus的blackbox与告警设置
  • printf实现
  • Elasticsearch 中的 term、terms 和 match 查询
  • 美易官方:开盘:美股高开科技股领涨 标普指数创盘中新高
  • STM32F407移植OpenHarmony笔记2
  • 数据仓库-相关概念
  • 线程的面试八股
  • Jmeter 配置元件
  • Java- @FunctionalInterface声明一个接口为函数式接口
  • Java使用Netty实现端口转发Http代理Sock5代理服务器