代码之家  ›  专栏  ›  技术社区  ›  frankodwyer

在ruby/rails中呈现大型XML集合的有效方法是什么?

  •  0
  • frankodwyer  · 技术社区  · 15 年前

    我试图在Ruby on Rails中将一个大型(ish)对象数组呈现为plist。该集合当前包含多达200个对象,每个对象本质上都是一个记录(键/值字典)。总的结果格式是plist(如Apple所用),但从逻辑上讲,它与任何XML文档没有太大的不同。

    我遇到的问题是渲染200个对象的数组大约需要一秒钟的时间,这对我来说太慢了。我目前使用的代码如下:

      def plistify(collection)
        resultarray=Array.new()
        collection.each do |entry|
          hash= entry.attributes
          hash["credits"]= entry.credits
          hash["ratingcount"]= entry.ratings.count
          hash["entryrating"]= entry.detail_rating
          hash["entryratingcount"]= entry.entryratingcount
          resultarray << hash
        end
        {'entries'=>resultarray}.to_plist
      end
    

    然后使用以下命令发送给客户端:

    format.text {render :text => plistify(@entries)}
    

    结果输出如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>entries</key>
        <array> <-- corresponds to resultarray above
            <dict> <-- corresponds to a single entry's attributes above. one of these per entry.
                <key>cached_review_id</key>
                <integer>190</integer>
                <key>cached_tag_list</key>
                <string>pub restaurant food waitress</string>
                <key>created_at</key>
                <date>2009-05-31T13:47:10Z</date>
                        ...about 20 key/values...
    

    几乎所有的开销都在ruby的plistiy代码中-相比之下,数据库开销是最小的。

    假设开销可能来自于创建大量的临时ruby对象,我已经尝试用一个视图替换所有这些,并在视图中使用一个构建器来创建相同的XML文档-它可以工作,但实际上是速度的两倍!

    有什么想法可以改进这一点,或者找出瓶颈?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Peer Allan    15 年前

    不确定你是否能做很多事情来改进这个,而不去钻研plist gem本身。查看存储库中的源代码“svn checkout” http://plist.rubyforge.org/svn/ “和 here 看起来gem是独立生成XML的,而不是使用XML库(比如LibXML、Nokogiri或builder)。

    我不确定使用其中一个库在为您生成XML方面会有多大的不同(它们在解析方面肯定更快),但它似乎是寻找优化机会的第一个合乎逻辑的地方。