在* NIX中实现tail的有效方法是什么?我提出(编写)了两个简单的解决方案,都使用一种圆形缓冲区将线加载到圆形结构中(数组|双向链接的圆形列表- 很有趣)。我已经看到了busybox中较旧的实现的一部分,并且据我了解,他们使用fseek查找EOF,然后“向后”阅读内容。有没有更干净,更快的东西?我在面试时被问到了,问问者看起来并不满意。先感谢您。
我认为没有其他解决方案不同于“保留最新的N行,同时向前读取数据”或“从头开始,然后向后退,直到您读取第N行”以外的解决方案。
关键是您将根据上下文使用一个或另一个。
当尾部访问随机访问文件时,或者当数据足够小以存储在内存中时,“尾随后退”更好。在这种情况下,运行时间被最小化,因为您扫描了必须输出的数据(因此,它是“最佳”的)
当以流水线填充尾部或数据量很大时,您的解决方案(保留N条最新行)更好。在这种情况下,其他解决方案浪费了太多内存,因此不切实际,并且在源慢于tail的情况下(很可能)扫描所有文件也没有太大关系。