Node.js Readline没有写入输出文件

时间:2018-05-22 10:53:57

标签: javascript node.js file stream

背景

我试图逐行读取几个GB大小的文件。我想处理每一行,然后将其写入文件。我不想(也不能)把所有东西都放进记忆中。

重要的是,我读取一行的顺序是我将其写入文件的顺序。

代码

为实现这一目标,我尝试使用Node.js Readline interface

const fs = require( "fs" ),
    readline = require( "readline" );

const readStream = fs.createReadStream( "./logs/report.csv" );
const writeStream = fs.createWriteStream( "./logs/out.csv", { encoding: "utf8"} );

const rl = readline.createInterface({
    input: readStream,
    output: writeStream,
    terminal: false,
    historySize: 0
});

rl.on( "line", function(line) {

    //Do your stuff ...
    const transformedLine = line.toUpperCase();
    console.log(transformedLine);

    //Then write to outstream
    rl.write(transformedLine );
});

问题

正如您所看到的,我正在尝试读取一行,对其进行解析,并将其写入名为out.csv的文件中。

问题是输出文件始终为空。没有任何东西写进去。

我已经阅读了所有方法,事件和选项,但显然我遗漏了一些东西。

问题

为什么这段代码没有写入文件?

3 个答案:

答案 0 :(得分:0)

你能试试吗

const fs = require( "fs" ),
readline = require( "readline" );

const readStream = fs.createReadStream("./logs/report.csv");
const writeStream = fs.createWriteStream("./logs/report.csv");

readStream.pipe(writeStream);

答案 1 :(得分:0)

答案

使用当前代码,我实际上再次向Readline提供transformedLine

这不是我想要的。我应该做的是直接写writeStream

rl.on( "line", function(line) {
    console.log(line);

    //Do your stuff ...
    const transformedLine = line.toUpperCase();
    console.log(transformedLine);

    //Then write to outstream
    writeStream.write( transformedLine );
});

这将产生一个与输入顺序相关的输出文件。

有关流技术和内部缓冲区的更详细讨论,请参阅:

答案 2 :(得分:0)

我问这个问题已经很晚了,但对于任何阅读此内容的人来说:

如果您在每个 In [392]: data['__function_workspace__'] Out[392]: array([[ 0, 1, 73, ..., 0, 0, 0]], dtype=uint8) In [393]: data['__function_workspace__'].shape Out[393]: (1, 33848) write 并且您的写入速度低于读取速度,您仍然会膨胀内存。虽然不如将整个文件读入内存。

您应该将 readpipe 一起使用,而不是 stream.Transform。原因是管道在流程中最慢的参与者阶段处理数据,因此不会膨胀内存。

readline