2014-06-30 160 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

输出文件包含未压缩的原始数据。 :-( –