2012-07-30 67 views
2

可能重复:
How would you implement tail efficiently?高效实现尾-n

我的一个朋友是问怎么他会实现tail -n。 要清楚,我们需要打印指定文件的最后一行n行。

我想使用n个字符串的数组并以循环方式覆盖它们。 但是,如果我们给出,说一个10 GB文件,这种方法根本没有规模。

有没有更好的方法来做到这一点?

回答

6

内存映射文件,从末尾迭代寻找行尾n次,从那一点开始写到文件结尾标准输出。

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

2

“这取决于”,毫无疑问。考虑到文件的大小应该是可知的,并且给定一个合理的文件操作库,它可以“搜索”到一个非常大的文件的末尾,而不用逐字逐个遍历每个字节或抖动虚拟内存,您可以简单地向后扫描最后统计换行符。

当您处理的文件虽然很大,但您如何处理退化的情况,其中n与多千兆字节文件中的行数接近?将东西存储在临时字符串中也不会缩放。