我的一位朋友被问及他是如何实施tail -n
的。
为清楚起见,我们需要打印指定文件的最后n
行。
我想过使用n个字符串的数组并以循环方式覆盖它们。
但是如果我们给出了一个10 GB
文件,那么这种方法根本不会扩展。
有更好的方法吗?
答案 0 :(得分:6)
内存映射文件,从末尾迭代寻找行结束n
次,从该点写入文件末尾到标准输出。
你可能通过不映射整个文件,但只是最后一个X kb的内存(比如几个内存页)并在那里寻找,可能使解决方案复杂化。如果没有足够的线,那么内存会映射一个更大的区域,直到你得到你想要的。您可以使用一些启发式方法来实现 guess 以确定要映射多少内存(例如,每行1kb作为粗略估计)。我不会真的这样做。
答案 1 :(得分:2)
当您处理的文件很大时,您如何处理n
接近多GB文件中行数的退化情况?在临时字符串中存储东西也不会扩展。