2016-10-14 14 views
0

私はRubyのZLibライブラリを使用して、小さな(10k)gzipファイル(StringIOクラスを使用してメモリ上にある)を解凍し、約2.5秒で解凍します。データの圧縮には約100msかかります。なぜ圧縮解除機能が圧縮機能よりも長い時間を要しているのか分かりません。Ruby zlibライブラリ非常に遅いgzipファイル

My機能は、(圧縮されたデータの内容で)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