如果您的日志文件按日期排序,那么您可以通过执行二进制搜索来避免搜索整个文件。在这种情况下,你会:
- 像你一样打开文件
- 使用lineo=快进到文件的中间。
- 检查行首的日期是否高于或低于您要查找的日期。
- 继续将文件分成两半,直到找到所需的内容。
但是,我确实认为您的文件需要非常大才能使上述内容有意义。
编辑
这是一些显示基本思想的代码。它找到包含搜索日期的行,而不是第一行。这可以通过更多的二分搜索或从最后一个不包含日期的中点进行线性搜索来解决。如果日期不在文件中,也没有终止条件。这些小的补充,留给读者作为练习:-)
require 'date'
def bin_fsearch(search_date, file)
f = File.open file
search = {min: 0, max: f.size}
while true
# go to file midpoint
f.seek (search[:max] + search[:min]) / 2
# read in until EOL
f.gets
# record the actual mid-point we are using
pos = f.pos
# read in next line
line = f.gets
# get date from line
line_date = Date.parse(line)
if line_date < search_date
search[:min] = f.pos
elsif line_date > search_date
search[:max] = pos
else
f.seek pos
return
end
end
end
bin_fsearch(Date.new(2013, 5, 4), '/var/log/system.log')