【发布时间】:2014-09-05 11:02:33
【问题描述】:
我需要在 node-js 中读取一个大的 zip 文件并处理每个文件(大约 100MB 的 zip 文件包含大约 40.000 个 XML 文件,每个未压缩文件 500kb)。我正在寻找一种速度可接受且不需要将整个数据集保存在内存中的“流”解决方案(JSZip、node-zip 对我有用,但它将所有内容都保存在 RAM 中并且性能不够好)。在 c# 中的快速尝试表明,在 2 岁的笔记本电脑上(使用 DotNetZip)可以在大约 9 秒内完成加载、解包和解析 XML。我不希望 nodejs 这么快,但是不到一分钟就可以了。将文件解压缩到本地磁盘然后处理它不是一种选择。
我目前正在尝试使用unzip 模块(https://www.npmjs.org/package/unzip)但无法使其工作,所以我不知道速度是否还可以,但至少看起来我可以流式传输每个文件并在回调中处理它。 (问题是我只收到前 2 个条目,然后它停止调用 .on('entry', callback) 回调。我没有收到任何错误,它只是在 2 个文件后静默停止。知道我怎么能得到也很好一个块中的完整 XML,而不是在一个缓冲区之后获取缓冲区。)
function openArchive(){
fs.createReadStream('../../testdata/small2.zip')
.pipe(unzip.Parse())
.on('entry', function (entry) {
var fileName = entry.path;
var type = entry.type; // 'Directory' or 'File'
var size = entry.size;
console.log(fileName);
entry.on('data', function(data){
console.log("received data");
});
});
}
有很多 node-js 模块用于处理 zip 文件,所以这个问题真的是要弄清楚哪个库最适合这种情况。
【问题讨论】:
-
当你说你“不能让它工作” - 什么问题?什么错误?其他人很难对一般性陈述进行故障排除。
-
我提到了什么不起作用。上面的代码只从一个 zip 文件中读取两个文件。
标签: javascript node.js