`wc -l` 是如何工作的?

det*_*ler 11 linux coreutils

我必须阅读一个大文件,在开始阅读之前,我需要知道文件中的总行数(以百万为单位)。

我已经实施了很多解决方案,并找到了一个。但是在我的搜索过程中,我想看看它是如何wc -l工作的。我在谷歌上找不到任何东西。

虽然我已经找到了解决我的问题的方法,但我仍然想知道wc -l它是如何工作的,因为它可以在几秒钟内计算一个 9200 万行的文件的行数!

如何?

ric*_*ici 20

它读取整个文件并计算行尾数。计数行尾真的很便宜;大部分时间花在阅读文件上。如果文件碰巧(大部分)在缓冲区缓存中,那也会很便宜。否则,它将取决于文件存储的速度。

换句话说,没有魔法。


Ton*_*nny 7

WC 只是以原始字节块读取文件(最好是文件所在的底层文件系统的自然块大小的倍数)。
然后它只是扫描缓冲区计算行尾字符。(它还计算空格、制表符、换页符和其他特殊字符,以防万一您需要 -l 输出以外的其他信息。)

就速度而言,从磁盘读取是代价高昂的部分。与此相比,缓冲区的扫描需要可忽略的时间。

假设您有 9000 万行,平均每行 100 个字符。
那大约是 9.000.000.000 个字符或大约 860 MB。
配备 SATA-3Gb/s 驱动器的体面 PC 将在 10 秒内完成。即使在一个相对较慢的文件系统上,同时还有一些其他活动。
具有一些性能调整和优化文件系统的快速机器可以在 5 秒内完成,即使不必求助于 SATA-6G 和 SSD 驱动器。