Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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 使用Nokogiri';SAX解析器_Ruby_Redis_Nokogiri_Sax_Saxparser - Fatal编程技术网

Ruby 使用Nokogiri';SAX解析器

Ruby 使用Nokogiri';SAX解析器,ruby,redis,nokogiri,sax,saxparser,Ruby,Redis,Nokogiri,Sax,Saxparser,我正试图用Nokogiri的SAX解析器解析一个大型XML文件 当我从一个文件中读取相同的数据时,它工作得非常好,但是当从Redis读取数据时,内存会超过1GB 下面是我可以用来复制这个问题的最基本的代码 知道它为什么这么做吗 class WordsList < Nokogiri::XML::SAX::Document def start_element name, attrs = [] end end row_数据方法是从Redis获取XML的方法 谢谢。运行此操作时,内存

我正试图用Nokogiri的SAX解析器解析一个大型XML文件

当我从一个文件中读取相同的数据时,它工作得非常好,但是当从Redis读取数据时,内存会超过1GB

下面是我可以用来复制这个问题的最基本的代码

知道它为什么这么做吗

class WordsList < Nokogiri::XML::SAX::Document

  def start_element name, attrs = []
  end

end
row_数据方法是从Redis获取XML的方法


谢谢。

运行此操作时,内存会发生什么变化:

require 'nokogiri'

File.open('xml.xml', 'w') do |f|
  f.puts '<?xml version="1.0" encoding="UTF-8"?>'
  f.puts '<my_root>'

  xml = <<'END_OF_XML'
  <note>
  <to>Tove</to>
  <from gender="F" age="25" address="123 Maple St.">Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
  </note>

  <note>
  <to>Tove</to>
  <from gender="F" age="25" address="123 Apple St.">Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
  </note>

END_OF_XML

  f.puts xml * 500_000 
  f.puts '</my_root>'
end

class WordsList < Nokogiri::XML::SAX::Document

  attr_writer :sort_key
  attr_reader :obj

  def initialize
    @obj      = []
    @sort_key = :address
    @limit    = 10
  end

  def sort_key
    @sort_key.to_s
  end

  def start_element name, attrs = []
    add_to_list Hash[attrs] if name == 'from'
  end

  def add_to_list hash
    @obj.push hash
    @obj = sorted.first(@limit)
  end

  def sorted
    @obj.sort_by do |item|
      begin
        Float(item[sort_key].gsub(",", ""))
      rescue ArgumentError
        item[sort_key].downcase
      end
    end.reverse
  end

end

my_handler = WordsList.new

parser = Nokogiri::XML::SAX::Parser.new(my_handler)
parser.parse(File.open('xml.xml'))
需要“nokogiri”
File.open('xml.xml','w')do | f|
f、 放入“
f、 放入“

xml=没有问题。我缩小了它的范围,即使有一个基本上为空的SAX文档,内存也会大大增加。我将更新帖子。
行数据方法是从Redis获取XML的方法。
然后,如果您还没有这样做,请开始研究该方法正在做什么。请发布行数据()的全部代码,包括代码运行所需的任何require语句。
require 'nokogiri'

File.open('xml.xml', 'w') do |f|
  f.puts '<?xml version="1.0" encoding="UTF-8"?>'
  f.puts '<my_root>'

  xml = <<'END_OF_XML'
  <note>
  <to>Tove</to>
  <from gender="F" age="25" address="123 Maple St.">Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
  </note>

  <note>
  <to>Tove</to>
  <from gender="F" age="25" address="123 Apple St.">Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
  </note>

END_OF_XML

  f.puts xml * 500_000 
  f.puts '</my_root>'
end

class WordsList < Nokogiri::XML::SAX::Document

  attr_writer :sort_key
  attr_reader :obj

  def initialize
    @obj      = []
    @sort_key = :address
    @limit    = 10
  end

  def sort_key
    @sort_key.to_s
  end

  def start_element name, attrs = []
    add_to_list Hash[attrs] if name == 'from'
  end

  def add_to_list hash
    @obj.push hash
    @obj = sorted.first(@limit)
  end

  def sorted
    @obj.sort_by do |item|
      begin
        Float(item[sort_key].gsub(",", ""))
      rescue ArgumentError
        item[sort_key].downcase
      end
    end.reverse
  end

end

my_handler = WordsList.new

parser = Nokogiri::XML::SAX::Parser.new(my_handler)
parser.parse(File.open('xml.xml'))