Ruby 技巧:如何高效读取大文件末尾的数据

在处理某些大文件(例如数以 G 计的文件)时,可以事先知道需要读取的数据即在文件的末尾部分(例如只需要知道文件最后大约5%的数据)。如果按照普通方法,从文件起始部分开始读取,将会花费大量时间在 IO 操作上。如果能像 *nix 的命令 tail 那样直接读取文件末尾的数据,将会大大提高处理程序的性能。在 Ruby 中,IO 类有如下三个常量用于指示从何处开始在 IO 流中搜寻数据:
SEEK_CUR:从当前位置开始
SEEK_END:从 IO 流末尾位置开始
SEEK_SET:从 IO 流起始位置开始(亦即”绝对位置“)

示例代码:


fileSize = File.size(fileName)
seeklen = ((0.05 * fileSize) * -1).to_i
file = File.open(ARGV[0)
file.seek(seeklen, IO::SEEK_END)
puts file.readlines