计算行数的最快方法?

4 c

计算文件中行号的最简单方法是:

while(!feof(fp))
{
  ch = fgetc(fp);
  if(ch == '\n')
  {
    lines++;
  }
}
Run Code Online (Sandbox Code Playgroud)

但现在要求是我必须计算大文件中的行数.它会对性能产生影响.

有更好的方法吗?

Dar*_*ust 6

对于最快的I/O,通常需要读取/写入文件系统/ OS 的块大小的倍数.

您可以通过调用statfsfstatfs在文件或文件描述符上查询块大小(阅读手册页).

struct statfs有一个场f_bsize,有时也f_iosize:

最佳传输块大小

f_bsize字段存在于所有POSIX系统AFAIK上.在Mac OS X和iOS上,还有f_iosize一个是您在这些平台上喜欢的(但也f_bsize可以在Mac OS X/iOS上运行,通常应该与f_iosizeIIRC 相同).

struct statfs fsInfo = {0};
int fd = fileno(fp); // Get file descriptor from FILE*.
long optimalSize;

if (fstatfs(fd, &fsInfo) == -1) {
    // Querying failed! Fall back to a sane value, for example 8kB or 4MB.
    optimalSize = 4 * 1024 * 1024;
} else {
    optimalSize = fsInfo.f_bsize;
}
Run Code Online (Sandbox Code Playgroud)

现在分配该大小的缓冲区并读取(使用readfread)该大小的块.然后迭代这个内存中的块并计算换行数.重复直到EOF.

另一种方法是@Ioan提出的方法:用于mmap将文件映射到内存并迭代该缓冲区.这可能会为您提供最佳性能,因为内核可以以最有效的方式读取数据,但是对于"太大"的文件,这可能会失败,而我上面描述的方法总是适用于任意大小的文件并且让您靠近 - 最佳性能.