我试图逐行读取几个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
的文件中。
问题是输出文件始终为空。没有任何东西写进去。
我已经阅读了所有方法,事件和选项,但显然我遗漏了一些东西。
为什么这段代码没有写入文件?
答案 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
并且您的写入速度低于读取速度,您仍然会膨胀内存。虽然不如将整个文件读入内存。
您应该将 read
与 pipe
一起使用,而不是 stream.Transform
。原因是管道在流程中最慢的参与者阶段处理数据,因此不会膨胀内存。
readline