怎么用node . js编写内存效率高的应用程序

  介绍

这篇文章主要介绍怎么用节点。js编写内存效率高的应用程序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

问题:大文件复制

如果有人被要求用NodeJS写一段文件复制的程序,那么他会迅速写出下面这段代码:

const  fs =,要求(& # 39;fs # 39;);      let  fileName =, process.argv [2];   let  destPath =, process.argv [3];      fs.readFile(文件名,(呃,,数据),=祝辞,{   ,,,if  (err), throw 犯错;      ,,,fs.writeFile (destPath  | |, & # 39;输出# 39;,,数据,(err),=祝辞,{   ,,,,,,,if  (err), throw 犯错;   ,,,});   ,,,,   ,,,console.log (& # 39; New  file  has  been 创建! & # 39;);   });

这段代码简单地根据输入的文件名和路径,在尝试对文件读取后把它写入目标路径,这对于小文件来说是不成问题的。

现在假设我们有一个大文件(大于4 GB)需要用这段程序来进行备份。就以我的一个达7.4 g的超高清4 k电影为例子好了,我用上述的程序代码把它从当前目录复制到别的目录。

,美元node  basic_copy.js  cartoonMovie.mkv  ~//bigMovie文档。mkv

然后在Ubuntu (Linux)系统下我得到了这段报错:

/home/shobarani/Workspace/basic_copy.js: 7

,,如果(err)把犯错;

,,,,,,,^

RangeError:文件大小大于可能的缓冲:

0 x7fffffff字节,,在FSReqWrap。readFileAfterStat [=> let  buffer  new 缓冲区(10);,#,10,为,buffer 的体积   console.log(缓冲);,#,prints  & lt; Buffer  00, 00, 00, 00, 00, 00, 00, 00, 00, 00在

在新版本的NodeJS(祝辞8)中,你也可以这样写。

let  Buffer =, new  Buffer.alloc (10);   console.log(缓冲);,#,prints  & lt; Buffer  00, 00, 00, 00, 00, 00, 00, 00, 00, 00在

如果我们已经有了一些数据,比如数组或者别的数据集,我们可以为它们创建一个缓冲区。

let  name =, & # 39; Node  JS  dev # 39;;   let  buffer =, Buffer.from(名称);   console.log(缓冲),#,prints  & lt; Buffer  4 e  6 f  64年,65年,20,4 a  53, 20, 44岁,45岁,5在

缓冲区有一些如buffer.toString()和buffer.toJSON()之类的重要方法,能够深入到其所存储的数据当中去。

我们不会为了优化代码而去直接创建原始buffer.NodeJS和V8引擎在处理流和网络插座的时候就已经在创建内部缓冲区(队)列中实现了这一点。

流(流)

简单来,说流就像NodeJS对象上的任意门。在计算机网络中,入口是一个输入动作,出口是一个输出动作。我们接下来将继续使用这些术语。

流的类型总共有四种:

<李>

可读流(用于读取数据)

<李>

可写流(用于写入数据)

<李>

双工流(同时可用于读写)

<李>

转换流(一种用于处理数据的自定义双工流,如压缩,检查数据等)

下面这句话可以清晰地阐述为什么我们应该使用流。

流API(尤其是stream.pipe()方法)的一个重要目标是将数据缓冲限制在可接受的水平,这样不同速度的源和目标就不会阻塞可用内存。

我们需要一些办法去完成任务而不至于压垮系统。这也是我们在文章开头就已经提到过的。

怎么用node . js编写内存效率高的应用程序

上面的示意图中我们有两个类型的流,分别是可读流和可写流…管()方法是一个非常基本的方法,用于连接可读流和可写流。如果你不明白上面的示意图,也没关系,在看完我们的例子以后,你可以回到示意图这里来,那个时候一切都会显得理所当然。管道是一种引人注目的机制,下面我们用两个例子来说明它。

解法1(简单地使用流来复制文件)

让我们设计一种解法来解决前文中大文件复制的问题。首先我们要创建两个流,然后执行接下来的几个步骤。

1。监听来自可读流的数据块

2。把数据块写进可写流

3。跟踪文件复制的进度

我们把这段代码命名为streams_copy_basic。js

/*   ,,,A  file  copy  with  streams 以及events 作用;作者:Naren  Arya   */const  stream =,要求(& # 39;流# 39;);   const  fs =,要求(& # 39;fs # 39;);      let  fileName =, process.argv [2];   let  destPath =, process.argv [3];      const  readabale =, fs.createReadStream(文件名);   const  writeable =, fs.createWriteStream (destPath  | |,“output");      fs.stat(文件名,(呃,,统计数据),=祝辞,{   ,,,this.fileSize =, stats.size;   ,,,this.counter =, 1;   ,,,this.fileArray =, fileName.split(& # 39; # 39;公司);   ,,,,   ,,,try  {   ,,,,,,,this.duplicate =, destPath  +,“/? +, this.fileArray [0], +, & # 39; _Copy # 39;公司,+,this.fileArray [1];   ,,,},捕捉(e), {   ,,,,,,,console.exception (& # 39; File  name  is 无效!,please  pass 从而proper 一个# 39;);   ,,,}   ,,,,   ,,,process.stdout.write(“文件:$ {this.duplicate}, is  being 创建:”);   ,,,,   ,,,readabale.on(& # 39;数据# 39;,,(块)=祝辞,{   ,,,,,,,let  percentageCopied =, ((chunk.length  *, this.counter),/, this.fileSize), *, 100;   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么用node . js编写内存效率高的应用程序