【问题标题】:Node.js: Processing a stream without running out of memoryNode.js:处理流而不会耗尽内存
【发布时间】:2012-07-06 20:40:01
【问题描述】:

我正在尝试读取一个巨大的日志文件(250,000 行),将每一行解析为一个 JSON 对象,并将每个 JSON 对象插入到 CouchDB 进行分析。

我试图通过创建一个缓冲流来单独处理每个块,但我总是在大约 300 行后耗尽内存。似乎使用 buffered streamsutil.pump 应该避免这种情况,但显然不是。

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

下面是 CoffeeScript,这里是 JavaScript:https://gist.github.com/5a89d3590f0a9ca62a23

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)

【问题讨论】:

  • 您应该能够使用流将文件提供给您。在“数据”事件中,您可以暂停流,然后在“\n”上拆分每个块。如果它不以“\n”结尾,则保留拆分中的最后一项以用于下一个块。确保在触发“结束”事件时处理剩余部分。使用 bufferstream 会使您的内存不足,实际上您将文件移动到内存中的缓冲区数组中。还应该使用 stream.pipe() 而不是 util.pump()。
  • 我会推荐使用 fs.createReadStream() - nodejs.org/api/fs.html#fs_fs_createreadstream_path_options
  • 也许这会有所帮助:https://github.com/nickewing/line-reader

标签: node.js stream file-processing


【解决方案1】:

也许这会有所帮助: Memory leak when using streams in Node.js?

尝试使用pipe()解决。

【讨论】:

    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 2011-04-05
    • 2015-02-19
    • 1970-01-01
    • 2010-09-15
    相关资源
    最近更新 更多