【问题标题】:Efficient implementation of tail -n [duplicate]tail -n 的高效实现 [重复]
【发布时间】:2012-07-30 15:36:56
【问题描述】:

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

有人问我的一个朋友如何实现tail -n。 为了清楚起见,我们需要打印指定文件的最后n 行。

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

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

【问题讨论】:

    标签: c++


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2010-12-14
        • 2012-04-27
        • 2012-02-24
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 1970-01-01
        • 2012-04-20
        • 2023-03-25
        相关资源
        最近更新 更多