我有一个大的压缩文件(GB),扩展名为.tar.gz,每行包含大量的SQL查询,所以我想逐行读取。目前我正在使用TarReader和Zlib gem进行以下操作:
tar_extract = Gem::Package::TarReader.new(Zlib::GzipReader.open('/Users/sachin.japate/Desktop/80637.tar.gz'))
tar_extract.rewind
tar_extract.each do |entry|
if entry.file?
query_list = entry.read.split("\n")
puts query_list
end
end
现在的问题是:当文件非常大时,这将超出整数范围,并给出此错误:
/usr/lib/ruby-flo/lib/ruby/2.1.0/rubygems/package/tar_reader/entry.rb:126:in `read': integer 7422013772 too big to convert to `int' (RangeError)
然后我就这样试了:
query = ""
while byte = entry.getc do
query = query + byte
if byte == "\n"
puts query
query = ""
end
end
虽然这很有效,但这很慢并影响了性能,所以我的问题是:有没有办法在内存中有效地逐行读取大型TarReader入口对象?