使用Savon和Nokogiri在Rails中解析XML SOAP响应时内存不足

我有一个使用SOAP webservice端点的Rails4webapp。对于每个公司,发送一个请求以获取资源列表(无论是哪种类型的,只是信息)。

该方法使用Savon 2发送请求,获取响应并使用Nokogiri进行解析,从而使用xpath处理XML资源。

这个循环一直运行良好,直到它试图获得一个拥有大量资源的特定公司,比其他公司多得多。然后,问题就来了。我在ubuntu中使用'top‘监控到,当进程开始处理响应时,进程会消耗RAM内存,直到它杀死rails应用程序。然后内存被释放,但webapp停止运行。

请在方法中找到示例代码:

# Initializing Savon client
client = Savon.client(wsdl: endpoint, 
                      log_level: :info,
                      log: true,
                      pretty_print_xml: true,
                      open_timeout: 300, 
                      read_timeout: 300)
for company in companies do
  message = {'in0' => USER_ID, 
             'in1' => USERNAME, 
             'in2' => MMK_PASSWORD,
             'in3' => company.id}
  @logger.debug "getResources=1"
  response = client.call(:get_resources, message: message) 
  @logger.debug "getResources=2"               
  resourcesXML = response.to_hash[:get_resources_response][:out]
  @logger.debug "getResources=3"              
  resourcesParsed = Nokogiri::XML(resourcesXML)
  @logger.info "getResources=4"
  resources = resourcesParsed.xpath("//resource")
  @logger.info "getResources=5"

日志显示为"getResources=3“。然后webapp就崩溃了。

你认为最好的方法是什么? 1.有没有更好的方法来处理这些信息,避免杀死应用程序。2.也许有一种方法可以部分处理响应? 3.有没有更好的性能工具来处理这种情况? 4.以上都不可能,我只能增加系统的RAM?我有一个4 4GB的Amazon AWS实例。

转载请注明出处:http://www.tstxxqczl.com/article/20230526/1895549.html