可能的重复:
您将如何有效地实现尾部?
我的一个朋友被问到他将如何实施tail -n
. 为了清楚起见,我们需要打印n
指定文件的最后几行。
我想过使用一个由 n 个字符串组成的数组并以循环方式覆盖它们。但是,如果我们给定一个10 GB
文件,那么这种方法根本无法扩展。
有一个更好的方法吗?
可能的重复:
您将如何有效地实现尾部?
我的一个朋友被问到他将如何实施tail -n
. 为了清楚起见,我们需要打印n
指定文件的最后几行。
我想过使用一个由 n 个字符串组成的数组并以循环方式覆盖它们。但是,如果我们给定一个10 GB
文件,那么这种方法根本无法扩展。
有一个更好的方法吗?
内存映射文件,从末尾迭代寻找行尾n
时间,从该点写入文件末尾到标准输出。
通过不映射整个文件,而只是映射最后 X kb 的内存(比如几个内存页)并在那里寻找,您可能会使解决方案复杂化。如果没有足够的行,那么内存映射一个更大的区域,直到你得到你想要的。您可以使用一些启发式方法来实现对要映射多少内存的猜测(例如粗略估计每行 1kb)。我不会真的这样做。
“这取决于”,毫无疑问。鉴于文件的大小应该是已知的,并且给定一个合理的文件操作库,它可以“寻找”到一个非常大的文件的末尾,而无需依次遍历每个字节或颠簸虚拟内存,您可以简单地从结束计数换行符。
但是,当您处理这么大的文件时,您如何处理n
接近多 GB 文件中行数的退化情况?将内容存储在临时字符串中也不会扩展。