/ / Knižnica Ruby zlib veľmi pomaly dekomprimuje súbor gzip - rubín, gzip, zlib, dekompresia

Ruby zlib Library veľmi pomaly k dekompresii súboru gzip - ruby, gzip, zlib, dekompresia

Na dekompresiu a. Používam knižnicu ZLib spoločnosti Rubyzmenšiť (10 kB) súbor gzip (v pamäti pomocou triedy StringIO) a jeho dekompresia trvá približne 2,5 sekundy. Kompresia údajov trvá ~ 100 ms, takže nechápem, prečo dekompresia trvá dlhšie ako kompresná funkcia.

Moja funkcia berie objekt StringIO (s obsahom komprimovaných údajov) a vracia pole (3 - kde „3“ je definované parametrom int_size) bajtovými celými číslami, napríklad:

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

Rovnaký súbor sa na príkazovom riadku OSX dekomprimuje jedným okom.

Existuje rýchlejší spôsob dekomprimovania súboru alebo možno rýchlejšia knižnica alebo spôsob, ako použiť gzip v miestnom systéme, aby sa to stalo veľa rýchlejšie ako je teraz?

odpovede:

0 pre odpoveď č. 1

Nie som si istý, čo sa tam deje (spomalenie som reprodukoval iba pomocou vysoko komprimovaného súboru gzip), ale dekompresia naraz je rýchlejšia, niečo podobné:

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

Rýchlejšie by sa stále používalo map namiesto slučky:

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