【发布时间】:2015-10-27 02:30:54
【问题描述】:
我一直在尝试使用可读和转换流来处理一个非常大的文件。我似乎遇到的问题是,如果我不把可写流放在最后,程序似乎在返回结果之前就终止了。
例如:rstream.pipe(split()).pipe(tstream)
我的tstream 有一个发射器,当计数器达到阈值时会发射。当该阈值设置为较低的数字时,我会得到一个结果,但是当它很高时,它不会返回任何内容。如果我将它传递给文件编写器,它总是返回一个结果。我错过了什么明显的东西吗?
代码:
// Dependencies
var fs = require('fs');
var rstream = fs.createReadStream('file');
var wstream = fs.createWriteStream('output');
var split = require('split'); // used for separating stream by new line
var QTransformStream = require('./transform');
var qtransformstream = new QTransformStream();
qtransformstream.on('completed', function(result) {
console.log('Result: ' + result);
});
exports.getQ = function getQ(filename, callback) {
// THIS WORKS if i have a low counter for qtransformstream,
// but when it's high, I do not get a result
// rstream.pipe(split()).pipe(qtransformstream);
// this always works
rstream.pipe(split()).pipe(qtransformstream).pipe(wstream);
};
这是Qtransformstream的代码
// Dependencies
var Transform = require('stream').Transform,
util = require('util');
// Constructor, takes in the Quser as an input
var TransformStream = function(Quser) {
// Create this as a Transform Stream
Transform.call(this, {
objectMode: true
});
// Default the Qbase to 32 as an assumption
this.Qbase = 32;
if (Quser) {
this.Quser = Quser;
} else {
this.Quser = 20;
}
this.Qpass = this.Quser + this.Qbase;
this.Counter = 0;
// Variables used as intermediates
this.Qmin = 120;
this.Qmax = 0;
};
// Extend the transform object
util.inherits(TransformStream, Transform);
// The Transformation to get the Qbase and Qpass
TransformStream.prototype._transform = function(chunk, encoding, callback) {
var Qmin = this.Qmin;
var Qmax = this.Qmax;
var Qbase = this.Qbase;
var Quser = this.Quser;
this.Counter++;
// Stop the stream after 100 reads and emit the data
if (this.Counter === 100) {
this.emit('completed', this.Qbase, this.Quser);
}
// do some calcs on this.Qbase
this.push('something not important');
callback();
};
// export the object
module.exports = TransformStream;
【问题讨论】:
-
你能贴出
QTransformStream实现的代码吗? -
输入文件中有多少行以及在这种情况下的最大计数器值是多少。如果计数器值大于行号,则不会发出
completed事件。您还需要推送null来结束流。不确定something not important中有什么,但在某些时候应该有一个null。 -
def的行数比计数器少,大约7000行。当我将它通过管道传输到写入流时,它确实有效。转换流是否需要 push(null) 才能工作?
-
你是对的,它不是。可能是别的东西。
标签: node.js stream node.js-stream