2009-08-07 12 views
0

私はRuby on Railsのplistとしてオブジェクトの大きな(ish)配列をレンダリングしようとしています。コレクションには現在200個までのオブジェクトが含まれています。各オブジェクトは基本的にレコード(キー/値の辞書)です。全体の結果フォーマットはplist(Appleが使用しています)ですが、論理的にはXMLドキュメントとあまり変わりません。ruby​​/railsで大きなXMLコレクションをレンダリングする効率的な方法は何ですか?

私がヒットした問題は、アレイが200個のオブジェクトで約2秒かかってしまうことです。これは私にとっては非常に遅いようです。私は現在、このようなコードを使用しています。その後、クライアントに送信され

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 

は使用して:ほぼすべての

<?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... 

など:

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

出力結果は以下のようになりますオーバーヘッドはルビの 'plistify'コードにあります - データベースのオーバーヘッドは比較して最小です。

オーバーヘッドが一時的なルビーオブジェクトをたくさん作成していると仮定して、私はこのすべてをビューに置き換えてみました。同じXMLドキュメントを作成するためにビューのBuilderを使用しました。 !

これを改善する方法や、ボトルネックを特定する方法については、

+0

"to_plist"メソッドは何をしますか? –

+0

to_plistメソッドはplist gemからのものです。自動的に指定されたハッシュを文字列形式のplist(つまり、qに表示されているXMLドキュメント形式)に変換します。 – frankodwyer

答えて

1

plist gem自体のハッキングなしにこれを改善することができるかどうかはわかりません。 "svn checkout http://plist.rubyforge.org/svn/"とhereというリポジトリのソースコードを見てみると、XMLライブラリ(LibXML、Nokogiri、builderなど)を使用するのとは異なり、宝石が独自にXMLを生成しているようです。

これらのライブラリの1つを使用すると、XMLの生成にどのくらいの差異が生じるかはわかりませんが、最適化の機会を探す最初の論理的な場所と思われます。

関連する問題