我有一个看起来像这样的大文件:
7
bla1
blala
blabla
blab
blals
blable
bla
more here..
第一个数字告诉我将有多少个值。问题是,我只想直接指向第 11 行(文本“此处更多……”),而不必先阅读所有这些值。就我而言,我有大量的数字,因此必须对其进行优化。
你能给我推荐一些东西吗?
您可能可以使用File#seek随机访问该文件。
这种方法的问题在于它只会访问指定字节偏移量的数据——而不是行偏移量。如果您的文件可以将文件开头的字节偏移量提供给列表完成的位置,那么您可以使用它。
你可以制作一些类似文件的东西,它会跳过前 N 行:
SkipFile.open("/tmp/frarees") do |ln|
puts ln # "more here.." and so on
end
puts SkipFile.new("/tmp/frarees").readline # "more here.."
像这样:
class SkipFile
def self.open(fn, &block)
sf = SkipFile.new(fn)
return sf unless block
sf.each(&block)
end
def initialize(fn)
@f = File.open(fn)
skip = @f.readline.to_i # Skip N lines as prescribed by the file
skip.times { @f.readline } # this could be done lazily
end
def each(&block)
@f.each(&block)
end
def readline
@f.readline
end
end
如果您只想向前遍历文件的行,这很容易做到。但是,如果您想准确地模仿File
orIO
界面(但请参阅Delegate
参考资料),特别是如果您想支持可回退到文件的假开头,这将变得很困难。
这是一种优雅的方法,尽管它需要一次将整个文件加载到内存中,但可能效率不高。
File.readlines(file_path)[10..-1] # indexing starts from 0
我认为您不会比这更有效率,因为您将读取文件中的字节以找出什么是“行”。
f = File.open('./data')
(f.readline.to_i + 2).times { f.readline }
p f.readline