Podemos utilizar indexOf dejar que la máquina virtual encontrar las nuevas líneas:
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);
});
};
Lo que esto hace es que la solución se encuentra la posición de la primera línea nueva usando .indexOf
. Incrementa lineCount
, luego encuentra la siguiente posición. El segundo parámetro para .indexOf
indica dónde comenzar a buscar nuevas líneas. De esta forma saltamos sobre grandes porciones del buffer. El ciclo while se ejecutará una vez por cada nueva línea, más uno.
Estamos dejando que el tiempo de ejecución del nodo haga la búsqueda para nosotros, que se implementa en un nivel inferior y debe ser más rápido.
En mi sistema, esto es aproximadamente el doble de rápido que ejecutar un bucle for
sobre la longitud del búfer en un archivo grande (111 MB).
'wc -l archivo' ... – zerkms
" using NodeJS "- ¿alguna razón técnica real detrás de este requisito? – zerkms
Estoy seguro de que 'wc' será más rápido que cualquier solución nodejs" nativa " – zerkms