ruby是否打开uri HTTP流限制下载或保存到临时文件?
我在服务器上有一个大的CSV文件,我想下载并分块处理,而不需要将整个内容读入内存。经过一番欺骗之后,我想到了这个:ruby是否打开uri HTTP流限制下载或保存到临时文件?,ruby,open-uri,Ruby,Open Uri,我在服务器上有一个大的CSV文件,我想下载并分块处理,而不需要将整个内容读入内存。经过一番欺骗之后,我想到了这个: require open-uri open("http://example.com/#{LARGE_CSV_FILE}") do |file| file.each_slice(50_000) do |fifty_thousand_lines| MyModel.import fifty_thousand_lines.join end end 我的理解是,openu
require open-uri
open("http://example.com/#{LARGE_CSV_FILE}") do |file|
file.each_slice(50_000) do |fifty_thousand_lines|
MyModel.import fifty_thousand_lines.join
end
end
我的理解是,openuri
的#open
将包装HTTP GET并返回类似于IO
的可枚举对象<代码>#每个_片(n)将一次向块传递n行数组。然后我加入并处理这些行
这个导入很好,看看我的OSX iStat菜单,看起来ruby进程的内存使用并没有失控然而,看起来我一次下载了所有文件。在内存使用量没有爆炸性增长的情况下,如何做到这一点
ruby是否将其下载到临时文件中,然后逐行从磁盘读取?我本以为openuri
反而会限制HTTP连接,只有在其块处理完其批数据后才下载更多数据
这是在不将文件全部加载到内存的情况下下载和处理文件的正确方法吗?是的,它确实下载到临时文件。这很容易从控制台观察到:
2.0.0-p247 :001 > require 'open-uri'
=> true
2.0.0-p247 :002 > f = open("http://stackoverflow.com/questions/19279715/does-ruby-open-uri-http-streaming-throttle-the-download-or-save-to-a-temp-file")
=> #<Tempfile:/tmp/open-uri20140220-27172-1kcjwk2>
2.0.0-p247:001>要求“打开uri”
=>正确
2.0.0-p247:002>f=打开(“http://stackoverflow.com/questions/19279715/does-ruby-open-uri-http-streaming-throttle-the-download-or-save-to-a-temp-file")
=> #
查看:将显示进程访问的文件lsof
也可以,但您需要在文件打开时捕获它。另一个要尝试的API是其读取方法Net::HTTP
。可能需要自己做一些缓冲,以确保获得完整的行,因为这是一个CSV。啊,谢谢你对fseventer的提醒,尼克。启动它并运行我的脚本。这就成功了。看起来像是openuri
下载到一个临时文件,然后从那里读取。下面是有问题的代码。不一定。如果文件大小小于库中定义的StringMax
常量,则返回StringIO
的实例,而不是Tempfile
。