Possiamo usare indexOf di lasciare che il VM trovare i ritorni a capo:
function countFileLines(filePath){
return new Promise((resolve, reject) => {
let lineCount = 0;
fs.createReadStream(filePath)
.on("data", (buffer) => {
let idx = -1;
lineCount--; // Because the loop will run once for idx=-1
do {
idx = buffer.indexOf(10, idx+1);
lineCount++;
} while (idx !== -1);
}).on("end",() => {
resolve(lineCount);
}).on("error", reject);
});
};
Cosa questa soluzione non è che si trova la posizione del primo ritorno a capo usando .indexOf
. Incrementa lineCount
, quindi trova la posizione successiva. Il secondo parametro su .indexOf
indica dove iniziare a cercare le nuove linee. In questo modo stiamo saltando su grandi blocchi del buffer. Il ciclo while verrà eseguito una volta per ogni nuova riga, più una.
Stiamo facendo in modo che il runtime del nodo esegua la ricerca che è implementato a un livello inferiore e dovrebbe essere più veloce.
Sul mio sistema questo è circa il doppio della velocità di un ciclo for
sulla lunghezza del buffer su un file di grandi dimensioni (111 MB).
fonte
2017-01-03 09:10:02
'wc -l file' ... – zerkms
" using NodeJS "- qualsiasi motivo tecnico reale dietro questo requisito? – zerkms
Sono sicuro che 'wc' sarà più veloce di qualsiasi soluzione nodejs" nativa " – zerkms