Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 最有效地下载、解压缩和分析Node JS中的许多文件_Node.js_Performance_Download_Zip - Fatal编程技术网

Node.js 最有效地下载、解压缩和分析Node JS中的许多文件

Node.js 最有效地下载、解压缩和分析Node JS中的许多文件,node.js,performance,download,zip,Node.js,Performance,Download,Zip,我必须从第三方主机下载大量压缩文件到我的NodeJS服务器上,解压缩、分析并存储它们。这些文件略多于18000个XML,每个大约在0.01到0.06mb之间。这些文件被分为8个大小各异的压缩文件夹 现在,这是我的过程: 使用请求库下载压缩文件 请求{url:fileUrl,编码:null},functionerr,resp,body{…} 将下载的文件写入目录 fs.writeFileoutput,body,functionerr{…} 使用extract-zip解压下载的材料并将其放入新目录中

我必须从第三方主机下载大量压缩文件到我的NodeJS服务器上,解压缩、分析并存储它们。这些文件略多于18000个XML,每个大约在0.01到0.06mb之间。这些文件被分为8个大小各异的压缩文件夹

现在,这是我的过程:

使用请求库下载压缩文件

请求{url:fileUrl,编码:null},functionerr,resp,body{…}

将下载的文件写入目录

fs.writeFileoutput,body,functionerr{…}

使用extract-zip解压下载的材料并将其放入新目录中

unzipoutput,{dir:directory},函数err{…}

删除下载的zip文件

fs.unlink'/a-directory/'+output,err=>{if err console.logerr;}

获取目录中的项目

fs.readdirfromDir,functionerr,items{…}

对于每个项目XML文件,读取它

fs.readFilefromDir+'/'+项'utf8',functionerr,xmlContents{…}

对于每个读取的XML文件,将其转换为JSON

让bill=xmlToJsonParser.toJsonxmlContents

我会做一些其他的事情,但我还没有写那部分

如果这对任何人都有帮助,我可以发布更完整的代码

正如你所看到的,这里有很多步骤,我有一种预感,其中一些可以被删除,或者至少可以提高效率


您对提高性能的建议是什么?–现在流程已经完成,但我每次都会达到100%的CPU,我相当肯定这是不好的。

扩展这类工作的一些一般准则:

在node.js中,完全异步I/O的步骤可以很好地扩展。 在执行大量I/O操作时,您需要能够同时控制有多少I/O操作在运行,以控制内存使用和TCP资源使用。因此,您可能会一次启动数百个请求,而不是一次启动18000个请求。当其中一个完成时,您将启动下一个。 使用大量CPU的步骤应该在一个进程中,只要有CPU,就可以运行N个步骤。这有助于提高CPU使用率。 尽量避免在内存中保留超出需要的内容。如果您可以通过管道将某些内容直接从网络传输到磁盘,那么与缓冲整个文件然后将整个内容写入磁盘相比,可以显著减少内存使用。 找出一些方法来管理等待辅助进程运行的作业的工作队列。你可以让你的主应用程序维护一个队列,并使用http请求它执行下一个作业,或者你甚至可以使用锁定文件在整个文件系统中运行它。 因此,以下是基于这些指南的一些更具体的信息:

我建议在步骤1和2中使用主服务器进程。前两个步骤都不是CPU密集型的,因此单个服务器进程应该能够处理无数个步骤。他们所做的只是异步I/O。您必须同时管理有多少个请求操作在运行,以避免TCP堆栈过载或内存使用,但除此之外,这应该可以很好地扩展,因为它只执行异步I/O

在步骤1和2中,您可以通过将响应直接传输到输出文件来减少内存使用,这样当字节到达时,它们会立即写入磁盘,而不会将整个文件保存在内存中

然后编写另一个node.js应用程序,该应用程序将执行步骤3-8步骤3和步骤7都是CPU密集型的。如果您以这样的方式编写它们,即它们只是从已知目录签出一个文件并处理它,那么您应该能够使其能够运行与您拥有的CPU数量相同的这些进程,从而在保持CPU负载远离主进程的同时获得规模

签出功能可以通过一个中心存储(如redis存储)来完成,也可以仅通过一个简单的服务器来完成,该服务器维护一个工作队列,跟踪哪些文件可用于工作,或者您甚至可以使用锁定文件完全通过文件系统逻辑来实现

现在进程完成了,但我每次都达到100%的CPU,我相当肯定这是不好的

如果您只有一个进程,并且它是100%CPU,那么您可以通过让更多进程参与进来来增加规模

正如你所看到的,这里有很多步骤,我有一种预感,其中一些可以被删除,或者至少可以提高效率

一些想法:

如前所述,通过管道将请求直接传递到下一个操作,而不是缓冲整个文件。 如果您有正确的解压工具,您甚至可以将请求通过管道直接传输到文件的解压器。如果您这样做,您将不得不水平扩展主进程以获得更多的CPU,但这将完全节省向磁盘读写压缩文件的时间。可以想象,您可以使用解压将步骤1-4合并到一个流写入中 使改变 如果执行步骤2中描述的转换流,那么将有一组单独的进程来执行步骤5-8。 以下是两个库,可用于组合管道和解压缩:


对于使用哪个库/等来按部分而不是一次解压文件,您有什么建议吗?@Dopapp-我不遵循您的具体解压要求,因为您没有提供实际代码。我添加了两个用于streams和.pipe的解压库。