尾部-n的高效实现

时间:2012-07-30 15:36:56

标签: c++

  

可能重复:
  How would you implement tail efficiently?

我的一位朋友被问及他是如何实施tail -n的。 为清楚起见,我们需要打印指定文件的最后n行。

我想过使用n个字符串的数组并以循环方式覆盖它们。 但是如果我们给出了一个10 GB文件,那么这种方法根本不会扩展。

有更好的方法吗?

2 个答案:

答案 0 :(得分:6)

内存映射文件,从末尾迭代寻找行结束n次,从该点写入文件末尾到标准输出。

你可能通过不映射整个文件,但只是最后一个X kb的内存(比如几个内存页)并在那里寻找,可能使解决方案复杂化。如果没有足够的线,那么内存会映射一个更大的区域,直到你得到你想要的。您可以使用一些启发式方法来实现 guess 以确定要映射多少内存(例如,每行1kb作为粗略估计)。我不会真的这样做。

答案 1 :(得分:2)

毫无疑问,“这取决于”。鉴于文件的大小应该是可知的,并且给定一个合理的文件操作库,它可以“寻找”到一个非常大的文件的末尾,而不是依次遍历每个字节或者颠倒虚拟内存,你可以简单地从结束新行。

当您处理的文件很大时,您如何处理n接近多GB文件中行数的退化情况?在临时字符串中存储东西也不会扩展。