2012-07-06 55 views
0

我试图读取一个巨大的日志文件(250,000行),将每行解析为JSON对象,并将每个JSON对象插入到CouchDB中进行分析。Node.js:处理流而不会耗尽内存

我试图通过创建一个缓冲的流,将单独处理每个块,但我总是用完大约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) 
+1

您应该可以使用流向您提供文件。在“数据”事件上,您可以暂停流,然后在“\ n”上拆分每个块。如果下一个块没有以“\ n”结尾,则保留下一个块的最后一个项目。确保在“结束”事件被触发时处理余数。使用bufferstream会让你失去内存,你本质上将文件移动到内存中的缓冲区数组中。也应该使用stream.pipe()而不是util.pump()。 – 2012-07-06 21:28:31

+0

我会推荐使用fs.createReadStream() - http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options – 2012-07-06 21:33:56

+1

也许这可以帮助: [https://github.com/nickewing/line-reader](https ://github.com/nickewing/line-reader) – inf3rno 2012-09-29 22:09:12

回答