Se você pode ajustar os dados finais em uma matriz, também não poderá ajustá-los em uma string e dividi-los, como foi sugerido? De qualquer forma, se você deseja processar o arquivo uma linha de cada vez, também pode tentar algo como isto:
var fs = require('fs');
function readLines(input, func) {
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
while (index > -1) {
var line = remaining.substring(0, index);
remaining = remaining.substring(index + 1);
func(line);
index = remaining.indexOf('\n');
}
});
input.on('end', function() {
if (remaining.length > 0) {
func(remaining);
}
});
}
function func(data) {
console.log('Line: ' + data);
}
var input = fs.createReadStream('lines.txt');
readLines(input, func);
EDIT: (em resposta ao comentário de phopkins ) Acho que (pelo menos nas versões mais recentes) a substring não copia dados, mas cria um objeto SlicedString especial (a partir de uma rápida olhada no código-fonte da v8). De qualquer forma, aqui está uma modificação que evita a substring mencionada (testada em um arquivo de vários megabytes no valor de "Todo o trabalho e nenhuma diversão faz de Jack um garoto chato"):
function readLines(input, func) {
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
var last = 0;
while (index > -1) {
var line = remaining.substring(last, index);
last = index + 1;
func(line);
index = remaining.indexOf('\n', last);
}
remaining = remaining.substring(last);
});
input.on('end', function() {
if (remaining.length > 0) {
func(remaining);
}
});
}