【问题标题】:Decompress, transform and compress back big file in nodejs在nodejs中解压缩,转换和压缩大文件
【发布时间】:2019-08-30 07:24:47
【问题描述】:

我有相当大的(30Gb gzipped,~300Gb gunzipped)gzip 压缩 rdf 文件,我需要逐行处理并将 gzip 压缩回另一个文件。所以这就是我目前拥有的(file 测试是 ~150Mb gzipped)

const fs = require('fs');
const zlib = require('zlib');
const readline = require('readline');

const readStream = fs.createReadStream('21million.rdf.gz').pipe(zlib.createGunzip());
const writeStream = fs.createWriteStream("21million.rdf");
const gzipStream = zlib.createGzip();

gzipStream.pipe(writeStream);


const rl = readline.createInterface({
    input: readStream,
    output: gzipStream,
});

rl.on('line', (line) => {
    gzipStream.write(`${line.toUpperCase()}\n`);
});

rl.on('close', () => {
    console.log('done');
    gzipStream.end();
});

问题在于我收到FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory的这种流程

所以问题是 - 我该如何设置它才不会遇到 OOM 问题?

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

【问题讨论】:

    标签: javascript node.js file-io zlib


    【解决方案1】:

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

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

    以下代码应该可以实现您想要实现的目标:

    const stream = require('stream');
    
    const transformStream = new stream.Transform({
        writableObjectMode: true,
        transform: (chunk, encoding, callback) => {
            const chunkText = chunk.toString(encoding);
            const modifiedChunkText = chunkText.toUpperCase(); // apply modifications to the text
            callback(false, Buffer.from(modifiedChunkText, encoding));
        }
    });
    
    readStream // reads from 21million.rdf.gz
        .pipe(transformStream) // transforms data
        .pipe(gzipStream) // writes to output file
        .on('finish', () => {
            console.log('done');
        });
    

    【讨论】:

    • 是的,今晚的工作是大写,但正如我所提到的,我需要逐行处理文件,我相信不能保证块中的所有行都会完整(第一/最后一行不会被打破)
    猜你喜欢
    • 2013-10-30
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多