2014-01-20 119 views
1

我想读取文件并处理文件的每一行。我使用readStream来读取文件,然后调用processRecord方法。 processMethod需要进行多次调用,并且需要在写入商店之前制作最终数据。在节点中读取文件并处理相同的文件

该文件有500K条记录。

我面临的问题是,文件读取速度很快,我相信节点没有获得足够的优先级来实际处理processLine方法。因此,内存高达800MB,然后减慢。

任何帮助表示赞赏。

那Im使用在下面给出的代码 -

var instream = fs.createReadStream('C:/data.txt'); 
var outstream = new stream; 

var rl = readline.createInterface({ 
    input: instream, 
     output: outstream, 
     terminal: false 
}); 
outstream.readable = true; 

rl.on('line', function(line) { 

processRecord(line); 
    } 
+0

按照下面的评论,尝试署名包,它具有相同的问题readline的 – Vaya

回答

0

Node.js的readline的模块旨在比线由行从文件流更多的用户交互。您可能会更喜欢流行的byline包装。

var fs = require('fs'); 
var byline = require('byline'); 

// You'll need to check the encoding. 
var lineStream = byline(fs.createReadStream('C:/data.txt', { encoding: 'utf8' })); 

lineStream.on('data', function (line) { 
    processRecord(line); 
}); 

如果将数据传送到另一个流,您将有更好的机会避免内存泄漏。我在这里假设processRecord正在融入其中。如果你制作了a transform stream object,那么你可以使用管道。

var out = fs.createWriteStream('output.txt'); 

lineStream.pipe(processRecordStream).pipe(out); 
+0

的署名也呈现出与readline的同样的问题。 – Vaya

+0

这可能是processRecord的问题。它对数据做了什么?你可能会保留引用和泄漏内存。如果可以的话,就像我在我的答案的第二部分中所建议的那样,尝试将它变成变换流。 – qubyte

相关问题