Javascript 在nodejs中解压、转换和压缩回大文件

Javascript 在nodejs中解压、转换和压缩回大文件,javascript,node.js,file-io,zlib,Javascript,Node.js,File Io,Zlib,我有一个相当大的(30Gb gzip,~300Gb gzip)gzip rdf文件,我需要逐行处理,然后将gzip返回到另一个文件。下面是我目前拥有的(测试中约150Mb Gzip) const fs=require('fs'); const zlib=require('zlib'); const readline=require('readline'); const readStream=fs.createReadStream('21000000.rdf.gz').pipe(zlib.crea

我有一个相当大的(30Gb gzip,~300Gb gzip)gzip rdf文件,我需要逐行处理,然后将gzip返回到另一个文件。下面是我目前拥有的(测试中约150Mb Gzip)

const fs=require('fs');
const zlib=require('zlib');
const readline=require('readline');
const readStream=fs.createReadStream('21000000.rdf.gz').pipe(zlib.createGunzip());
const writeStream=fs.createWriteStream(“2100万.rdf”);
const gzipStream=zlib.createGzip();
gzipStream.pipe(writeStream);
const rl=readline.createInterface({
输入:readStream,
输出:gzipStream,
});
rl.on('行',(行)=>{
写入(`${line.toUpperCase()}\n`);
});
rl.on('关闭',()=>{
console.log('done');
gzipStream.end();
});
问题在于我收到的此类流
致命错误:无效的标记压缩接近堆限制分配失败-JavaScript堆内存不足

所以问题是-我如何设置它,这样我就不会碰到OOM问题


另外,我知道它可以用sed、awk、pert等来完成,但我需要用js来完成。

这是由于Node.js处理的方式。它也被称为。当可读流提供数据的速度快于写入程序可以使用的速度时,就会发生这种情况,这会导致内存使用率增加,因为数据必须保存在内存中,直到整个过程完成

解决此问题的一种方法是使用流,它通过管道处理数据转换

以下代码应该完成您试图实现的目标:

const stream=require('stream');
const transformStream=new stream.Transform({
writableObjectMode:true,
转换:(区块、编码、回调)=>{
const chunkText=chunk.toString(编码);
const modifiedChunkText=chunkText.toUpperCase();//对文本应用修改
回调(false,Buffer.from(modifiedChunkText,encoding));
}
});
readStream//从21000000.rdf.gz读取
.pipe(transformStream)//转换数据
.pipe(gzip流)//写入输出文件
.on('finish',()=>{
console.log('done');
});

是的,这是uppercasing的夜间工作,但正如我所提到的,我需要逐行处理文件,而且我相信不能保证区块中的所有行都会完成(第一行/最后一行不会断开)