我正在使用Ruby的ZLib库来解压一个小的(10k)gzip文件(在内存中使用StringIO类),它的解压时间大约为2.5秒。 压缩数据需要大约100ms,所以我不明白为什么解压的时间比压缩函数的时间长。
我的函数接收一个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的方法来实现这个功能呢?很多 比现在更快?
我不知道这是怎么回事(我只用一个高压缩的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
你也可以用 红宝石-zstds,它的api类似于 gzip
. 但是... zstd
压缩和解压的速度非常快。请试一试。