在Node.JS中一次读取大量文件N行

我有一个65,000,000行的文件,大小约2GB。

我想一次读取N行这个文件,执行db插入操作,然后读取下一个N,在这种情况下N是1000。 插入顺序并不重要,所以同步是好的。

这样做的最好方法是什么? 我只发现一次加载1行,或者将整个文件读入内存的方法。 下面的示例代码,我一直用它读取一行文件。 :

var singleFileParser = (file, insertIntoDB) => { var lr = new LineByLineReader(file); lr.on('error', function(err) { // 'err' contains error object console.error(err); console.error("Error reading file!"); }); lr.on('line', function(line) { insertIntoDB(line); // 'line' contains the current line without the trailing newline character. }); lr.on('end', function() { // All lines are read, file is closed now. }); }; 

行只能由某人一次parsing。 所以,如果你想要一次10,那么你只是一次收集一个,直到你收集了10个,然后处理10个。

我不认为Jarek的代码工作正常,所以这是一个不同的版本,收集10行到一个数组,然后调用dbInsert()

 var tenLines = []; lr.on('line', function(line) { tenLines.push(line); if (tenLines.length === 10) { lr.pause(); dbInsert(<yourSQL>, function(error, returnVal){ if (error) { // some sort of error handling here } tenLines = []; lr.resume(); }); } }); // process last set of lines in the tenLines buffer (if any) lr.on('end', function() { if (tenLines.length !== 0) { // process last set of lines dbInsert(...); } }); 

Jarek的版本似乎在每一line事件上调用dbInsert() ,而不是仅在每一line事件中调用dbInsert() ,如果不是10行长的完美倍数,则不会在文件末尾处理任何剩余的行。

像这样的事情应该做的

 var cnt = 0; var tenLines = []; lr.on('line', function(line) { tenLines.push(line); if (++cnt >= 10) { lr.pause(); // prepare your SQL statements from tenLines dbInsert(<yourSQL>, function(error, returnVal){ cnt = 0; tenLines = []; lr.resume(); }); } });