Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby是否打开uri HTTP流限制下载或保存到临时文件?_Ruby_Open Uri - Fatal编程技术网

ruby是否打开uri HTTP流限制下载或保存到临时文件?

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

我在服务器上有一个大的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
我的理解是,
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