2016-10-14 30 views
0

我正在使用Ruby的ZLib庫來解壓縮一個小文本(10k)gzip文件(在內存中使用一個StringIO類),並花費大約2.5秒來解壓縮。壓縮數據需要約100ms,所以我不明白爲什麼解壓縮的時間大於壓縮函數。Ruby zlib庫解壓gzip文件速度很慢

我的函數採用一個StringIO對象(與壓縮數據的內容),並返回的數組(3 - ,其中「3」由int_size參數定義的)字節的整數,如:

def decompress(io, int_size = 3) 
    array = Array.new(262144) 
    i = 0 
    io.rewind 
    gz = Zlib::GzipReader.new(io) 
    until gz.eof? 
    buffer = gz.read(int_size) 
    array[i] = buffer.unpack('C*').inject { |r, n| r << 8 | n } 
    i += 1 
    end 
    array 
end 

同一個文件在眨眼之間在OSX命令行解壓縮。

是否有更快的方式來解壓縮文件,或者更快的庫或使用本地系統上的gzip來實現這種情況的方法比現在更快?

+0

使用系統工具時,只要你可以,這些工具是驚人的效率。他們超級優化,非常可靠。 – yeyo

+0

是啊,那是我的想法 - 但我該怎麼做? – Ash

+0

http://blog.bigbinary.com/2012/10/18/backtick-system-exec-in-ruby.html – yeyo

回答

0

我不知道發生了什麼事情在那裏(我轉載緩慢只能用高壓縮gzip文件),但解壓一下子快,像這樣:

def decompress(io, int_size = 3) 
    array = Array.new(262144) 
    i = 0 
    io.rewind 
    gz = Zlib::GzipReader.new(io) 
    dec = gz.read 
    seq = StringIO.new(dec, "rb") 
    until seq.eof? 
     buffer = seq.read(int_size) 
     array[i] = buffer.unpack('C*').inject { |r, n| r << 8 | n } 
     i += 1 
    end 
    array 
end 

更快仍然是使用map而不是循環:

def decompress(io, int_size = 3) 
    io.rewind 
    gz = Zlib::GzipReader.new(io) 
    dec = gz.read 
    dec.unpack('C*').each_slice(int_size).to_a.map {|t| t.inject {|r,n| r << 8 | n}} 
end