首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js:计算文件中的行数

问Node.js:计算文件中的行数
EN

Stack Overflow用户
提问于 2012-09-17 12:16:12
回答 10查看 58.6K关注 0票数 40

我有一个很大的文本文件,范围在30MB和10GB之间。如何使用Node.js计算文件中的行数

我有以下限制:

  • 整个文件不需要写入内存
  • 不需要子进程来执行任务
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-09-17 13:16:46

不使用wc的解决方案:

代码语言:javascript
复制
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);
  });

它更慢,但没有你期望的那么多-包括node.js加载和启动时间的140M+文件-0.6秒

代码语言:javascript
复制
>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
票数 39
EN

Stack Overflow用户

发布于 2012-09-17 12:29:28

您可以按照注释中的建议使用wc来完成此操作

代码语言:javascript
复制
var exec = require('child_process').exec;

exec('wc /path/to/file', function (error, results) {
    console.log(results);
});
票数 30
EN

Stack Overflow用户

发布于 2017-01-03 17:10:03

我们可以使用indexOf让VM找到换行符:

代码语言:javascript
复制
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循环将为每个换行符运行一次,加一次。

我们让Node运行时为我们做搜索,这是在较低的级别实现的,应该会更快。

在我的系统上,这大约是在一个大文件(111MB)上运行一个缓冲区长度的for循环的两倍。

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12453057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档