我必须从第三方主机将大量压缩文件下载到我的Node JS服务器上,解压缩,分析并存储它们。这些文件略多于18000个XML,每个XML介于约0.01和0.06mb之间。这些文件被分成8个大小不一的压缩文件夹。
现在,这是我的过程:
使用request
库
request({ url: fileUrl, encoding: null }, function(err, resp, body) {...});
将下载的文件写入目录
fs.writeFile(output, body, function(err) {...});
使用extract-zip
解压缩下载的资料并放入新目录
unzip(output, { dir : directory }, function (err) {...});
删除下载的zip文件
fs.unlink('/a-directory/' + output, (err) => { if (err) console.log(err); });
获取目录中的项目
fs.readdir(fromDir, function(err, items) {...});
对于每个项目(XML文件),请阅读
fs.readFile(fromDir + '/' + item, 'utf8', function(err, xmlContents) {...});
对于每个读取的XML文件,将其转换为JSON
let bill = xmlToJsonParser.toJson(xmlContents)
会做其他一些事情,但我还没写过那部分
如果能帮助任何人,我可以发布更完整的代码。
正如你所看到的,这里有很多步骤,我预感到其中一些可以删除或至少提高效率。
你对提高性能有什么建议? - 现在这个过程完成了,但我每次都达到了100%的CPU,我相当肯定是坏的。
答案 0 :(得分:1)
扩展此类工作的一些一般准则:
所以,这里有一些基于这些指南的更具体的细节:
我说使用主服务器进程执行步骤1和2.前两个步骤都不是CPU密集型的,因此单个服务器进程应该能够处理其中的大量数据。他们所做的只是异步I / O.您必须同时管理有多少request()
次操作,以避免TCP堆栈或内存使用量过载,但除此之外,这应该可以扩展,因为它只进行异步I / O。
您可以通过将响应直接传送到输出文件来减少步骤1和2中的内存使用量,以便在字节到达时立即将它们写入磁盘,而不将整个文件保存在内存中。
然后编写另一个执行步骤3 - 8的node.js应用程序(步骤3和7可能是CPU密集型)。如果你以一种只是"结帐"来自已知目录的文件并对其进行处理,您应该能够创建它,以便您可以像运行CPU一样运行这些进程,从而获得扩展,同时还可以使CPU负载远离主进程。
结账功能可以通过一个中央存储(如redis商店,甚至只是一个维护工作队列的简单服务器)来跟踪哪些文件可用于工作,或者你甚至可以使用锁定文件完全使用文件系统逻辑实现它。
现在该过程完成,但我每次都达到100%的CPU,我相当肯定是坏的。
如果您只有一个进程并且它处于100%CPU,那么您可以通过获取更多进程来增加规模。
正如你所看到的,这里有很多步骤,我预感到其中一些可以删除或至少提高效率。
一些想法:
以下是一些可用于组合管道和解压缩的库: