来自文件读取流的Nodejs不定式流
Posted
技术标签:
【中文标题】来自文件读取流的Nodejs不定式流【英文标题】:Nodejs infinitive stream from file read stream 【发布时间】:2015-12-08 12:44:45 【问题描述】:我在尝试完成相当平庸的任务时遇到了麻烦。我需要从输入 txt 文件创建 nodejs 可读流。我需要对此流执行一些转换(为每一行创建 JSON 对象)。
问题是我希望这个流是不定式的:在读取最后一行之后,流应该从头开始。我的解决方案有效,但收到警告消息:
(node) 警告:检测到可能的 EventEmitter 内存泄漏。添加了 11 个排水监听器。使用emitter.setMaxListeners() 增加限制。
我希望找到简单的解决方案,而不是直接读取和缓冲文件。
//Transform stream object
var TransformStream = function ()
Transform.call(this, objectMode: true);
;
util.inherits(TransformStream, Transform);
TransformStream.prototype._transform = onTransform;
TransformStream.prototype._flush = onEnd;
var ts = new TransformStream();
var infinStream = function ()
var r = fs.createReadStream(filePath);
r.pipe(split(), end: false)
.pipe(ts, end: false);
r.once('end', function ()
//console.log('\n\n\n\nRead file stream finished. Lines counted:\n\n\n\n' + detectionCounter);
r.removeAllListeners();
r.destroy();
infinStream();
);
return r;
;
infinStream();
return ts;
【问题讨论】:
如果你有一个不是不定式大的文件,那么总会有一个结束。但是你为什么想要一个循环。你想要返回的数据做什么? 当没有答案时,这意味着我完全错过了一些东西。我将设备输出保存在 txt 文件中。我想要的是模拟设备输出的服务器 - 意味着它将从文件中流式传输数据,直到中断。 为什么要使用循环文件流来模拟设备输出?设备输出也不是不定式大。我也认为你在这里遗漏了一些东西。我不明白你想做什么,但我很确定解决方案不是不定式大文件流。 我需要每天 24 小时运行的服务器,并且会一直模拟设备输出。无论设备输出有多大,我都需要使其不定式。我想到的最简单的解决方案是将导出不定式流的模块。我想知道它是否存在更智能的解决方案。 【参考方案1】:来自cmets:
我需要每天 24 小时运行的服务器,并且将模拟设备 一直输出。
为此,递归函数是个好主意。你做的方法没问题。当您不需要对数据进行不同的转换任务时,实际上不需要流。简单事件可以完全按照您的意愿进行,并且更容易理解。
您的代码中的错误是您放置监听器的地方。侦听器r.once
在您的递归函数中。您在函数内部定义 r,因此每个函数调用都会创建一个新的 r。因为 r.once 不能像您期望的那样工作。
你可以做什么:
-
创建一个发出事件的递归函数
使用您在户外活动的数据
这只是一个简单的概念,使用简单的事件,它会在整个时间内触发文件中的数据:
// Your recursive function
var simulateDeviceEvents = function()
fs.readFile('device.txt', function (err, data)
if (err) throw err;
// Just emit the event here
Emitter.emit('deviceEvent', data);
);
//If this happens to fast you could also call it with
//a timeout.
simulateDeviceEvents();
;
// Start the function
simulateDeviceEvents();
//IMPORTANT: The listener must be defined outside your function!
Emitter.on('deviceEvent', function(data)
// Do something with your data here
);
【讨论】:
感谢您的努力。不幸的是,您的解决方案不适合我想要实现的目标。 fs.readFile 不能使用,因为,整个过程的重点是逐块读取文件(文件太大以将其保存在内存中),并将其作为单个流处理,而无需摸索块组合等......我喜欢使用自定义事件发射器的方法,但即便如此,这个递归函数也需要是我已经使用 fs.createReadStream 的 EventEmmiter。以上是关于来自文件读取流的Nodejs不定式流的主要内容,如果未能解决你的问题,请参考以下文章