2009-08-07 6 views
0

J'essaye de rendre un grand tableau (ish) d'objets comme un plist dans Ruby on Rails. La collection contient actuellement jusqu'à 200 objets, dont chacun est essentiellement un enregistrement (dictionnaire de clés/valeurs). Le format de résultat global est un plist (tel qu'utilisé par Apple) mais logiquement, il n'est pas très différent de tout document XML.Qu'est-ce qu'un moyen efficace de rendre une grande collection XML dans ruby ​​/ rails?

Le problème que j'ai rencontré est que le rendu du tableau prend environ une seconde avec 200 objets, ce qui me semble incroyablement lent. Je suis actuellement en utilisant le code comme ceci:

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 

qui est ensuite envoyé au client en utilisant:

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

La sortie résultante ressemble à quelque chose comme:

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

etc. Presque tous le surcoût est dans le code "plistify" de ruby ​​- le surcoût de base de données est minime par comparaison. En supposant que la surcharge pourrait provenir de la création de nombreux objets ruby ​​temporaires, j'ai essayé de remplacer tout ceci par une vue, et d'utiliser un Builder dans la vue pour créer le même document XML - ça marche mais il est deux fois plus lent !

Des idées pour améliorer ou identifier le goulot d'étranglement?

+0

Que fait la méthode "to_plist"? –

+0

la méthode to_plist provient de la gemme plist - elle convertit automatiquement le hachage donné en une forme de chaîne (c'est-à-dire le format de document XML affiché dans le q) – frankodwyer

Répondre

1

Vous ne savez pas si vous pouvez faire beaucoup pour améliorer cela sans vous tromper dans la gemme plist elle-même. En regardant le code source du dépôt ici "svn checkout http://plist.rubyforge.org/svn/" et here il semble que le gem génère le XML tout seul, contrairement à l'utilisation d'une bibliothèque XML (comme LibXML, Nokogiri ou builder). Je ne suis pas sûr de savoir à quel point utiliser une de ces bibliothèques pour générer le XML (ils sont certainement plus rapides à l'analyse) pour vous, mais il semble être le premier endroit logique pour chercher des opportunités d'optimisation.

Questions connexes