6
我有問題需要下載,解壓縮,然後逐行處理一個非常大的CSV文件。我認爲這是有益的給你一個想法的文件有多大:用ruby流解壓大csv文件
- big_file.zip〜700MB
- big_file.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,但如果它對這樣的事情更好,我完全贊成)。
我不認爲流式傳輸的zip會正常工作,因爲zip文件的結構如何。如果zip中只有一個文件(或者我想要的文件是第一個文件),那麼它可能會做一些類似'funzip'的事情,但事實並非如此。 – ZombieDev