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