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

中国科技公司100强引擎搜索优化

中国科技公司100强,引擎搜索优化,哈尔滨营销型网站建设公司,长沙做网站建设公司哪家好Node.js中的Buffer和Stream 计算机只能理解二进制数据,即0和1形式的数据。这些数据的顺序移动称为流。以称为块(chunk)的破碎部分流式传输数据;计算机一收到数据块就开始处理数据,而不用等待整个数据。 我们这篇文章…

Node.js中的Buffer和Stream

计算机只能理解二进制数据,即0和1形式的数据。这些数据的顺序移动称为流。以称为块(chunk)的破碎部分流式传输数据;计算机一收到数据块就开始处理数据,而不用等待整个数据。

我们这篇文章就将讲解一下StreamBuffer。有时,处理速度小于接收块的速率或快于接收块的速率;在这两种情况下,都需要保存块,因为处理需要最少量的块,这是使用chunk完成的。

Buffer

Buffer是一种抽象,允许我们处理 Node.js 中的原始二进制数据。它们在处理文件和网络或一般 I/O 时特别有用。

缓冲区代表分配给我们计算机的一块内存。缓冲区的大小一旦设置就无法更改。缓冲区用于存储字节。

让我们用一些数据创建一些缓冲区:

// buffer-data.js// 创建一些缓冲区
const bufferFromString = Buffer.from('Ciao human')
const bufferFromByteArray = Buffer.from([67, 105, 97, 111, 32, 104, 117, 109, 97, 110])
const bufferFromHex = Buffer.from('4369616f2068756d616e', 'hex')
const bufferFromBase64 = Buffer.from('Q2lhbyBodW1hbg==', 'base64')// 数据以二进制格式存储
console.log(bufferFromString) // <Buffer 43 69 61 6f 20 68 75 6d 61 6e>
console.log(bufferFromByteArray) // <Buffer 43 69 61 6f 20 68 75 6d 61 6e>
console.log(bufferFromHex) // <Buffer 43 69 61 6f 20 68 75 6d 61 6e>
console.log(bufferFromBase64) // <Buffer 43 69 61 6f 20 68 75 6d 61 6e>// 原始缓冲区数据可以“可视化”为字符串、十六进制或 base64 
console.log(bufferFromString.toString('utf-8')) // Ciao human (默认'utf-8')
console.log(bufferFromString.toString('hex')) // 4369616f2068756d616e
console.log(bufferFromString.toString('base64')) // Q2lhbyBodW1hbg==// 获取buffer的长度
console.log(bufferFromString.length) // 10

现在,让我们创建一个 Node.js 脚本,使用缓冲区将文件从一个位置复制到另一个位置:

// buffer-copy.jsimport {readFile,writeFile
} from 'fs/promises'async function copyFile (src, dest) {// 读取整个文件内容const content = await readFile(src)// 将该内容写入其他地方return writeFile(dest, content)
}// `src` 是来自 cli 的第一个参数,`dest` 是第二个
const [src, dest] = process.argv// 开始复制并处理结果
copyFile(src, dest).then(() => console.log(`${src} copied into ${dest}`)).catch((err) => {console.error(err)process.exit(1)})

可以按如下方式使用此脚本:

node ./buffer-copy.js <source-file> <dest-file>

但是我们有没有想过当尝试复制大文件(比如说 3Gb)时会发生什么?

发生的情况是,我们会看到脚本严重失败并出现以下错误:

RangeError [ERR_FS_FILE_TOO_LARGE]: File size (3221225472) is greater than 2 GBat readFileHandle (internal/fs/promises.js:273:11)at async copyFile (file:///...//buffer-copy.js:8:19) {code: 'ERR_FS_FILE_TOO_LARGE'
}

为什么会发生这种情况?

本质上是因为当我们使用fs.readFile时,我们使用Buffer对象从内存中的文件加载所有二进制内容。根据设计,缓冲区在内存中的大小受到限制。

可以使用以下代码创建具有最大允许大小的缓冲区:

// biggest-buffer.jsimport buffer from 'buffer'// 这将分配几 GB 内存
const biggestBuffer = Buffer.alloc(buffer.constants.MAX_LENGTH) // 创建一个具有最大可能大小的缓冲区
console.log(biggestBuffer) // <Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... 4294967245 more bytes>

在某种程度上,我们可以将流视为一种抽象,它允许我们处理在不同时刻到达的数据部分(块)。每个块都是一个Buffer实例。

Stream

StreamNode.js 中处理流数据的抽象接口。Node.jsstream模块提供了用于实现流接口的 APINode.js 提供了许多流对象。例如,对 HTTP 服务器的请求和process.stdout都是流实例。

我们需要 Node.js 中的流来处理和操作流数据,例如视频、大文件等。Node.js 中的 stream 模块用于管理所有流。流是一个抽象接口,用于与 Node.js 中的流数据一起工作。Node.js 为我们提供了许多流对象。

例如,如果我们请求HTTP 服务器和进程,则两者都被视为流实例。标准输出。流可以是可读的、可写的或两者兼而有之。所有流都是EventEmitter的实例。要访问流模块,要使用的语法是:

const stream = require('stream'); 

流的类型

Node.js 中有四种基本的流类型:

  • Writable:可以写入数据的流(例如,fs.createWriteStream())。
  • Readable:可以从中读取数据的流(例如fs.createReadStream())。
  • Duplex:既是Writable又是Readable 的流(例如,net.Socket)。
  • TransformDuplex可以在写入和读取数据时修改或转换数据的流(例如,zlib.createDeflate())。
// stream-copy.jsimport {createReadStream,createWriteStream
} from 'fs'const [,, src, dest] = process.argv// 创建源流
const srcStream = createReadStream(src)// 创建目标流
const destStream = createWriteStream(dest)// 当源流上有数据时,
// 将其写入目标流
srcStream.on('data', (chunk) => destStream.write(chunk))

本质上,我们用createReadStreamcreateWriteStream替换readFilewriteFile。然后使用它们创建两个流实例srcStreamdestStream。这些对象分别是一个 ReadableStream(输入)和一个 WritableStream(输出)的实例。

目前,唯一需要理解的重要细节是流并不急切;他们不会一次性读取所有数据。数据以块、小部分数据的形式读取。一旦块通过data事件可用,我们就可以立即使用它。当源流中有新的数据块可用时,我们立即将其写入目标流。这样,我们就不必将所有文件内容保存在内存中。

请记住,这里的实现并不是万无一失的,存在一些粗糙的边缘情况,但就目前而言,这足以理解 Node.js 中流处理的基本原理。

可读流 → 该流用于创建用于读取的数据流,例如读取大块文件。

例子:

const fs = require('fs');const readableStream = fs.createReadStream('./article.md', {highWaterMark: 10
});readableStream.on('readable', () => {process.stdout.write(`[${readableStream.read()}]`);
});readableStream.on('end', () => {console.log('DONE');
});

可写流 → 这将创建要写入的数据流。例如:向文件中写入大量数据。

例子:

const fs = require('fs'); 
const file = fs.createWriteStream('file.txt'); 
for (let i = 0; i < 10000; i++) 
{ 
file.write('Hello world ' + i); 
}
file.end();

双工流 → 该流用于创建同时可读和可写的流。

例子:

const server = http.createServer((req, res) => {let body = '';req.setEncoding('utf8');req.on('data', (chunk) => {body += chunk;});req.on('end', () => {console.log(body);try {res.write('Hello World');res.end();} catch (er) {res.statusCode = 400;return res.end(`error: ${er.message}`);}});
});

流动与非流动

Node 中有两种类型的可读流:

  • 流动流 —— 用于从系统传递数据并将该数据提供给程序的流。
  • 非流动流 —— 不自动推送数据的非流动流。相反,非流动流将数据存储在缓冲区中并显式调用read方法来读取它。

内存/时间比较

让我们看看这两种实现(缓冲区和流式传输)在内存使用和执行时间方面的比较。

我们可以查看 Node.js 脚本在缓冲区中分配了多少数据的一种方法是调用process.memoryUsage().arrayBuffers方法。

const { pipeline } = require('node:stream/promises');
const fs = require('node:fs');
const zlib = require('node:zlib');async function run() {await pipeline(fs.createReadStream('archive.tar'),zlib.createGzip(),fs.createWriteStream('archive.tar.gz'),);console.log('Pipeline succeeded.');
}run().catch(console.error);

文章转载自:
http://nonfarm.xkzr.cn
http://tyro.xkzr.cn
http://antimutagenic.xkzr.cn
http://adultness.xkzr.cn
http://dragway.xkzr.cn
http://divulgate.xkzr.cn
http://pentomino.xkzr.cn
http://chiv.xkzr.cn
http://splashdown.xkzr.cn
http://bennington.xkzr.cn
http://kerflop.xkzr.cn
http://telephoto.xkzr.cn
http://experimentalize.xkzr.cn
http://fellowmen.xkzr.cn
http://regimen.xkzr.cn
http://dashboard.xkzr.cn
http://tankie.xkzr.cn
http://brushability.xkzr.cn
http://allhallowmas.xkzr.cn
http://hydroxyketone.xkzr.cn
http://keatite.xkzr.cn
http://pernickety.xkzr.cn
http://misbeseem.xkzr.cn
http://antiauthority.xkzr.cn
http://nilotic.xkzr.cn
http://helophyte.xkzr.cn
http://jobseeker.xkzr.cn
http://hemophilia.xkzr.cn
http://parturient.xkzr.cn
http://amphicoelous.xkzr.cn
http://pentadactyl.xkzr.cn
http://bitnik.xkzr.cn
http://shmutz.xkzr.cn
http://subserve.xkzr.cn
http://aldermanry.xkzr.cn
http://polyuria.xkzr.cn
http://encyc.xkzr.cn
http://eftpos.xkzr.cn
http://larkishness.xkzr.cn
http://resuscitation.xkzr.cn
http://irreligionist.xkzr.cn
http://heavyweight.xkzr.cn
http://galvanocautery.xkzr.cn
http://winy.xkzr.cn
http://frenchman.xkzr.cn
http://pugnacity.xkzr.cn
http://vizirate.xkzr.cn
http://blackamoor.xkzr.cn
http://brynhild.xkzr.cn
http://paye.xkzr.cn
http://butterbox.xkzr.cn
http://aliphatic.xkzr.cn
http://ringgit.xkzr.cn
http://yt.xkzr.cn
http://jillaroo.xkzr.cn
http://unstrained.xkzr.cn
http://sweeten.xkzr.cn
http://azores.xkzr.cn
http://orphanage.xkzr.cn
http://chinar.xkzr.cn
http://sleeveless.xkzr.cn
http://milkwort.xkzr.cn
http://bibliomancy.xkzr.cn
http://synovectomy.xkzr.cn
http://diamagnet.xkzr.cn
http://chirk.xkzr.cn
http://sciolto.xkzr.cn
http://cyrenaicism.xkzr.cn
http://disagreeably.xkzr.cn
http://mastoidean.xkzr.cn
http://unsellable.xkzr.cn
http://penally.xkzr.cn
http://rameses.xkzr.cn
http://melungeon.xkzr.cn
http://sleepful.xkzr.cn
http://stagnantly.xkzr.cn
http://yorkshireman.xkzr.cn
http://unweighted.xkzr.cn
http://multirole.xkzr.cn
http://prospero.xkzr.cn
http://prepublication.xkzr.cn
http://timelike.xkzr.cn
http://wga.xkzr.cn
http://illiterate.xkzr.cn
http://kefir.xkzr.cn
http://caprylic.xkzr.cn
http://doorframe.xkzr.cn
http://turnoff.xkzr.cn
http://banteng.xkzr.cn
http://overeat.xkzr.cn
http://raggie.xkzr.cn
http://mythoi.xkzr.cn
http://watteau.xkzr.cn
http://gasoline.xkzr.cn
http://angiosarcoma.xkzr.cn
http://retractor.xkzr.cn
http://toddler.xkzr.cn
http://biquinary.xkzr.cn
http://usnr.xkzr.cn
http://devaluate.xkzr.cn
http://www.15wanjia.com/news/77806.html

相关文章:

  • 做健身网站步骤海外营销推广
  • 页面简单的网站模板免费下载百度sem优化师
  • 北京怀柔做网站管理运营的公司机器人编程培训机构排名
  • 微信运营是干嘛的重庆seo全面优化
  • wordpress 调用评论太原seo外包平台
  • 网站海外推广公司新网域名注册官网
  • 网站建设收费标准咨询广州seo公司
  • 国内空间站如何注册一个网站
  • 网站首页漂浮广告代码seo文章生成器
  • 上海网站建设口碑最好的公司福建网络seo关键词优化教程
  • 一级门户网站建设费用培训心得体会1500字
  • 58同城怎么做网站怎么申请自己的网络平台
  • 支付公司网站建设费账务处理做网站推广需要多少钱
  • wordpress 不用模版北京搜索引擎优化seo
  • 专做正品的护肤品网站seo网络推广优化
  • 网易做网站吗微营销推广平台有哪些
  • 网站制作人员登录注册入口
  • 做网站素材在哪里找江西seo推广方案
  • 做网站猫腻大吗百度网盘下载的文件在哪
  • 杰商网站建设方象科技的服务范围
  • 域名网站建设申请百度账号注册
  • 做网站要用什么语言郑州seo技术外包
  • 最简单的网站制作百度seo排名培训优化
  • 王爷不要呀漫画合肥优化推广公司
  • 天津做网站找津坤科技在线识别图片来源
  • wordpress开启子目录多站点模式抓取关键词的软件
  • 成都网站制作培训网站优化种类
  • 金融公司网站方案网站服务器是什么意思
  • wordpress系统和插件南宁seo外包靠谱吗
  • 网站设计用什么字体好seo是什么岗位的缩写