我有问题需要下载、解压缩然后逐行处理一个非常大的 CSV 文件。我认为让您了解文件的大小很有用:
- 大文件.zip ~700mb
- 大文件.csv ~23gb
这是我希望发生的一些事情:
- 解压前不必下载整个文件
- 在解析 csv 行之前不必解压缩整个文件
- 在执行所有这些操作时不要占用太多内存/磁盘
我不知道这是否可能。这就是我的想法:
require 'open-uri'
require 'rubyzip'
require 'csv'
open('http://foo.bar/big_file.zip') do |zipped|
Zip::InputStream.open(zipped) do |unzipped|
sleep 10 until entry = unzipped.get_next_entry && entry.name == 'big_file.csv'
CSV.foreach(unzipped) do |row|
# process the row, maybe write out to STDOUT or some file
end
end
end
以下是我所知道的问题:
open-uri
读取整个响应并将其保存到一个Tempfile
不适合这种大小的文件的文件中。我可能需要Net::HTTP
直接使用,但我不知道该怎么做并且仍然得到一个IO
.- 我不知道下载速度会有多快,也不知道它的
Zip::InputStream
工作方式是否符合我展示的工作方式。当它还没有全部存在时,它可以解压缩一些文件吗? - 将
CSV.foreach
与 rubyzip 的工作InputStream
?它的行为是否足够像File
它能够解析出行?如果它想读取但缓冲区是空的,它会发疯吗?
我不知道这是否是正确的方法。也许一些 EventMachine 解决方案会更好(虽然我以前从未使用过 EventMachine,但如果它更适合这样的事情,我完全赞成)。