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