如果你有一个大的日志文件,数十亿行长。这些文件包含一些列,例如IP地址:xxx.xxx.xxx.xxx
。
如何快速找到确切的一行,例如我想找到123.123.123.123
。
天真的逐行搜索似乎太慢了。
答案 0 :(得分:1)
如果您没有任何其他信息(例如日期范围,假设文件已排序),则逐行搜索是您的最佳选择。现在,这并不意味着你需要阅读。此外,您可能更有效率地向后搜索,因为您知道该条目是最近的。
一般方法(向后搜索)是:
声明一个缓冲区。您将尽可能快地将文件块读取到此缓冲区中(最好使用可以直接读取而无需任何缓冲/缓存的低级操作系统调用)。
所以你寻找文件的末尾减去缓冲区的大小并读取那么多字节。
现在,您可以在缓冲区中搜索第一个换行符。请记住稍后的偏移,因为它代表一个部分线。从下一行开始,向前搜索缓冲区的末尾,查找字符串。如果它必须在某个列中但其他列可以包含该值,那么您需要进行一些解析。
现在,您继续向后搜索文件。您寻找您读取的最后一个位置减去块大小加上您在搜索换行符时找到的偏移量。现在,你再读一遍。如果您愿意,可以将该部分行移动到缓冲区的末尾并读取更少的字节,但如果您的块足够大,则不会产生巨大的差异。
然后继续,直到到达文件的开头。当然,当读取的字节数小于块大小时(即,您不忽略第一行)有一种特殊情况。我假设您不会到达文件的开头,因为您似乎不想搜索整个文件。
当你不知道价值在哪里时,这就是方法。如果您对订购有所了解,那么当然您可能想要进行二分搜索。在这种情况下,您可以使用较小的块大小(足以至少捕获一整行)。
答案 1 :(得分:0)
你真的需要在文件中搜索一些规律并利用它,除此之外,如果你有更多的处理器,你可以将文件拆分成并且并行搜索 - 假设I / O不会成为瓶颈。