我有一个非常大的文件,大约有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
您可以使用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 的块大小读取源文件,并将每个压缩的块添加到输出流中。根据您的环境调整块大小以满足您的偏好。
foreach
或each
逐行读取文件比通过read
一次性读取更可取,特别是当文件很大时。一次性读取不具有可扩展性。为什么不让gzip处理整个任务,而不是使用Ruby和Zlib呢?它将在编译代码中运行,而不是在解释脚本中。 - the Tin Man