gpt4 book ai didi

ruby-on-rails - 用于大型 XML 下载的快速 ruby​​ http 库

转载 作者:数据小太阳 更新时间:2023-10-29 07:40:22 26 4
gpt4 key购买 nike

我正在使用各种返回大型 XML 文件(> 2MB)的 XML-over-HTTP Web 服务。减少“下载”时间的最快的 ruby​​ http 库是什么?

必需的功能:

  • GET 和 POST 请求

  • gzip/deflate 下载(接受编码:deflate、gzip)- 非常重要

我在考虑:

  • 打开uri

  • 网络::HTTP

  • 遏制

但您也可以提出其他建议。

附言为了解析响应,我使用了来自 Nokogiri 的拉式解析器,因此我不需要像 rest-client 或 hpricot 这样的集成解决方案。

最佳答案

您可以使用 EventMachineem-http流式传输 XML:

require 'rubygems'
require 'eventmachine'
require 'em-http'
require 'nokogiri'

# this is your SAX handler, I'm not very familiar with
# Nokogiri, so I just took an exaple from the RDoc
class SteamingDocument < Nokogiri::XML::SAX::Document
def start_element(name, attrs=[])
puts "starting: #{name}"
end

def end_element(name)
puts "ending: #{name}"
end
end

document = SteamingDocument.new
url = 'http://stackoverflow.com/feeds/question/2833829'

# run the EventMachine reactor, this call will block until
# EventMachine.stop is called
EventMachine.run do
# Nokogiri wants an IO to read from, so create a pipe that it
# can read from, and we can write to
io_read, io_write = IO.pipe

# run the parser in its own thread so that it can block while
# reading from the pipe
EventMachine.defer(proc {
parser = Nokogiri::XML::SAX::Parser.new(document)
parser.parse_io(io_read)
})

# use em-http to stream the XML document, feeding the pipe with
# each chunk as it becomes available
http = EventMachine::HttpRequest.new(url).get
http.stream { |chunk| io_write << chunk }

# when the HTTP request is done, stop EventMachine
http.callback { EventMachine.stop }
end

它可能有点低级,但对于任何文档大小来说可能是性能最高的选项。给它数百兆,它不会填满你的内存,就像任何非流式解决方案一样(只要你不保留你正在加载的大部分文档,但这是你的事情)。

关于ruby-on-rails - 用于大型 XML 下载的快速 ruby​​ http 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2833829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com