2010-04-12 52 views
2

我想在一个巨大的文件(4演出)上使用Zlib :: Deflate.deflate。这样做存在明显的问题,第一个问题是我无法一次将整个文件加载到内存中。 Zlib :: GzipWriter可以工作,因为它适用于流,但它不是zlib压缩。有任何想法吗?红宝石zlib泄气海量数据

回答

3

你可以尝试实例化一个Zlib :: Deflate流,并从零碎的大文件中提供数据。 Zlib :: Deflate :: deflate声称在幕后做这种事情。

这将是这个样子:

z = Zlib::Deflate.new 

File.open "big_uncompressed_file" do |f| 
    File.open "big_compressed_file", "w" do |w| 
    f.each do |str| 
     w << z.deflate str, Zlib::SYNC_FLUSH 
    end 
    end 
end 
z.finish 
z.close 

ruby zlib docs

notes on zlib flush flags

+0

的Zlib本身并以这种方式逐步工作 - 你给它的缓存数据的增量和它吐出来压缩数据。 – ConcernedOfTunbridgeWells 2010-04-12 16:41:31

+0

您希望在big_compressed_file(“w”)末尾输出完成。 – toothrot 2013-10-21 15:39:03

+0

@ConcernedOfTunbridgeWells即'w << z.deflate(str,Zlib :: NO_FLUSH)'? @toothrot即'f.write(z.finish)'? – 2016-02-12 23:51:24