`wc -l` 如何工作?

`wc -l` 如何工作?

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

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

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

如何?

答案1

它读取整个文件并计算行尾数。计算行尾数非常便宜;大部分时间都花在读取文件上。如果文件恰好(大部分)在缓冲区缓存中,那么这也将很便宜。否则,这将取决于文件存储的速度。

换句话说,没有魔法。

答案2

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

从速度上来说,从磁盘读取是代价昂贵​​的部分。相比之下,缓冲区的扫描所花的时间可以忽略不计。

假设您有 9000 万行,平均每行 100 个字符。
这大约是 9.000.000.000 个字符或大约 860 MB。
一台配备 SATA-3Gb/s 驱动器的普通 PC 可以在 10 秒内完成此操作。即使在相对较慢的文件系统上,同时还有其他活动正在进行。一台
经过性能调整和优化的文件系统的快速机器可以在 5 秒内完成此操作,甚至无需使用 SATA-6G 和 SSD 驱动器。

答案3

欢迎来到免费软件的世界。您可以随时查看源代码

虽然我必须承认我不是一名 C 程序员,所以我不是那个能真正为你解释代码的人(而且我我自己很感兴趣。

我知道的是,由于 wc 不会自己打开文件,而是要求操作系统来打开,因此这在很大程度上取决于操作系统,当然还取决于文件的存储方式。除此之外,我希望必须采用正确的编程实践,例如不要尝试一次读取整个文件等。

相关内容