0
我试图读取一个巨大的日志文件(250,000行),将每行解析为JSON对象,并将每个JSON对象插入到CouchDB中进行分析。Node.js:处理流而不会耗尽内存
我试图通过创建一个缓冲的流,将单独处理每个块,但我总是用完大约300行后内存不足。似乎使用buffered streams和util.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()。 – 2012-07-06 21:28:31
我会推荐使用fs.createReadStream() - http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options – 2012-07-06 21:33:56
也许这可以帮助: [https://github.com/nickewing/line-reader](https ://github.com/nickewing/line-reader) – inf3rno 2012-09-29 22:09:12