Node.js readStream结束大文件

我想在电子邮件通知中偶尔发送大型日志文件(> 100MB)的最后2KB。 现在,我正在尝试以下内容:

var endLogBytes = fs.statSync(logFilePath).size; var endOfLogfile = fs.createReadStream(logFilePath, {start: endLogBytes-2000, end: endLogBytes - 1, autoClose: true, encoding: 'utf8'}); endOfLogfile.on('data', function(chunk) { sendEmailFunction(chunk); } 

由于我刚刚重新启动,我的日志文件只有〜2MB,但随着他们变大,我想知道:

1)读取数据是否需要很长时间(节点是否遍历整个文件,直到它到达我想要的字节,或节点跳到我想要的字节?)

2)消耗多less内存?

3)内存空间何时释放? 如何释放内存空间?

在这种情况下,你不应该使用ReadStream。 因为它是必须的(我想)在最后两千字节之前磨碎所有的预先数据。 所以我会做fs.open ,然后fs.read与打开文件的描述符。 像那样:

 fs.open(logFilePath, 'r', function(e, fd) { if (e) throw e; //or do whatever you usually doing in such kind of situations var endOfLogfile = new Buffer(2048); fs.read(fd, endOfLogFile, endLogBytes-2048, 2048, null, function(e, bytesRead, data) { if (e) throw e; //don't forget to data.toString('ascii|utf8|you_name_it') sendEmailFunction(data.toString('ascii')); }); }); 

更新:看起来像ReadStream的当前实现足够聪明,只读取所需的数据量。 请参阅: https : //github.com/joyent/node/blob/v0.10.29/lib/fs.js#L1550 。 它使用fs.open和fs.read引擎盖下。 所以你可以使用ReadStream而不用担心。 无论如何,我会去fs打开/阅读,因为它是更明确的,C方式,更好的风格等等。

关于记忆和释放它。 你将需要至less2Mb的内存数据缓冲+一些开销。 我不认为有一些方法可以告诉我们需要多less开销。 只需用目标操作系统和节点版本进行testing。 您可以使用此模块进行性能分析: https : //www.npmjs.org/package/webkit-devtools-agent 。

内存将被释放,当你不会使用数据缓冲区和GC会决定这是收集一些垃圾的好时机。 GC是非确定性的(即不可预测的)。 你不应该试图预测它的行为或强迫它以垃圾收集的方式。