Node.js:在不耗尽内存的情况下处理流

Node.js:在不耗尽内存的情况下处理流,node.js,stream,file-processing,Node.js,Stream,File Processing,我试图读取一个巨大的日志文件(250000行),将每一行解析为一个JSON对象,并将每个JSON对象插入CouchDB进行分析 我试图通过创建一个缓冲流来实现这一点,该缓冲流将分别处理每个块,但我总是在大约300行之后耗尽内存。它看起来像是在使用,应该避免这种情况,但显然不是 (也许有比node.js和CouchDB更好的工具,但我有兴趣学习如何在node.js中进行这种文件处理,并且认为这应该是可能的。) 下面是CoffeeScript,这里是JavaScript: 也许这有助于: 尝试使用

我试图读取一个巨大的日志文件(250000行),将每一行解析为一个JSON对象,并将每个JSON对象插入CouchDB进行分析

我试图通过创建一个缓冲流来实现这一点,该缓冲流将分别处理每个块,但我总是在大约300行之后耗尽内存。它看起来像是在使用,应该避免这种情况,但显然不是

(也许有比node.js和CouchDB更好的工具,但我有兴趣学习如何在node.js中进行这种文件处理,并且认为这应该是可能的。)

下面是CoffeeScript,这里是JavaScript:

也许这有助于:


尝试使用
pipe()
来解决此问题。

您应该能够使用流将文件提供给您。在“数据”事件上,您可以暂停流,然后在“\n”上拆分每个块。如果拆分中的最后一项没有以“\n”结尾,请将其保留为下一个块。确保在触发“end”事件时处理剩余部分。使用bufferstream将耗尽内存,实际上是将文件移动到内存中的缓冲区数组中。此外,还应使用stream.pipe()而不是util.pump()。我建议使用fs.createReadStream()-这可能会有所帮助:
fs = require 'fs'
util = require('util')
BufferStream = require('bufferstream')

files = [
  "logfile1",
]

files.forEach (file)->
  stream = new BufferStream({encoding:'utf8', size:'flexible'})
  stream.split("\n")
  stream.on("split", (chunk, token)->
    line = chunk.toString()
    # parse line into JSON and insert in database
  )
  util.pump(fs.createReadStream(file, {encoding: 'utf8'}), stream)