在ruby中逐行读取一个大的.tar.gz文件

时间:2017-08-17 14:12:59

标签: ruby zlib

我有一个大的压缩文件(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入口对象?

0 个答案:

没有答案