使用Zlib在Ruby中压缩大文件以实现gzip功能。

5

我有一个非常大的文件,大约有2亿行数据。

我想使用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

使用foreacheach逐行读取文件比通过read一次性读取更可取,特别是当文件很大时。一次性读取不具有可扩展性。为什么不让gzip处理整个任务,而不是使用Ruby和Zlib呢?它将在编译代码中运行,而不是在解释脚本中。 - the Tin Man
1个回答

10

您可以使用IO#read从文件中读取任意长度的数据块。

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 的块大小读取源文件,并将每个压缩的块添加到输出流中。根据您的环境调整块大小以满足您的偏好。


在我看来没问题。你是说输出文件包含原始数据,未压缩,还是说输出文件没有被创建? - Chris Heald
输出文件包含未压缩的原始数据。 :-( - Jackson
2
我认为我知道答案了。最新版本的vim会自动解压缩文件。 - Jackson
哈哈哈哈,是的,我也用 vim 在看它。很好的发现。 - Chris Heald
即使vim在膨胀数据,使用此代码压缩后文件的大小仍然保持不变。 - Aditya Sanghi
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接