2014-06-30 161 views
4

我有一個非常大的文件,約。 2億行數據。用Zlib壓縮大文件的gzip

我想用Zlib庫壓縮它,特別是使用Writer。

每次讀取每行一行似乎需要相當長的一段時間。有沒有更好的方法來完成這一點?

這是我現在所擁有的:

require 'zlib' 

Zlib::GzipWriter.open('compressed_file.gz') do |gz| 
File.open(large_data_file).each do |line| 
    gz.write line 
end 
gz.close 
end 
+0

使用'foreach'或'each'逐行閱讀與通過'read'啜食它比較好,特別是當文件很大時。 Slurping不可擴展。爲什麼不讓gzip處理整個任務,而不是使用Ruby和Zlib?它將以編譯代碼運行,而不是解釋腳本。 –

回答

8

您可以使用讀取從文件中讀取任意長度的大塊IO#。

require 'zlib' 

Zlib::GzipWriter.open('compressed_file.gz') do |gz| 
File.open(large_data_file) do |fp| 
    while chunk = fp.read(16 * 1024) do 
    gz.write chunk 
    end 
end 
gz.close 
end 

這將讀取16kb塊中的源文件並將每個壓縮塊添加到輸出流。根據您的環境調整塊大小以適合您的偏好。

+0

謝謝!順便說一下,我的代碼是否正確?我試圖壓縮tsv文件,但是每當我運行我發佈的代碼時,它都沒有看到壓縮數據。 –

+0

它看起來很適合我。您是說輸出文件包含原始數據,未壓縮或輸出文件未創建? –

+0

輸出文件包含未壓縮的原始數據。 :-( –