Node.js:计算文件中的行数
我有大的文本文件,其范围在30MB
到10GB
之间。 如何使用Node.js
文件中的行数?
我有这些限制:
解决方案不使用wc:
var i;
var count = 0;
require('fs').createReadStream(process.argv[2])
.on('data', function(chunk) {
for (i=0; i < chunk.length; ++i)
if (chunk[i] == 10) count++;
})
.on('end', function() {
console.log(count);
});
它速度较慢,但并不如你所期望的那么多 - 对于140M +文件包括0.6s,包括node.js加载和启动时间
>time node countlines.js video.mp4
619643
real 0m0.614s
user 0m0.489s
sys 0m0.132s
>time wc -l video.mp4
619643 video.mp4
real 0m0.133s
user 0m0.108s
sys 0m0.024s
>wc -c video.mp4
144681406 video.mp4
你可以这样做,因为评论建议使用wc
var exec = require('child_process').exec;
exec('wc /path/to/file', function (error, results) {
console.log(results);
});
我们可以使用indexOf让虚拟机找到换行符:
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);
});
};
这个解决方案的功能是使用.indexOf
找到第一个换行符的位置。 它增加lineCount
,然后找到下一个位置。 .indexOf
的第二个参数告诉从哪里开始寻找换行符。 这样我们就跳过了大块的缓冲区。 while循环将为每个换行运行一次,再加一个。
我们让节点运行时搜索我们在较低级别上实现的应该更快。
在我的系统上,这大约是在大文件(111 MB)上对缓冲区长度运行for
循环的两倍。