Как эффективен способ рендеринга большой коллекции XML в ruby ​​/ rails? - PullRequest
0 голосов
/ 07 августа 2009

Я пытаюсь отобразить большой (ish) массив объектов в виде списка в Ruby on Rails. Коллекция в настоящее время содержит до 200 объектов, каждый из которых по сути является записью (словарь ключей / значений). Общий формат результата представляет собой plist (используемый Apple), но логически он не сильно отличается от любого XML-документа.

Проблема, с которой я столкнулся, состоит в том, что рендеринг массива занимает около 200 секунд с 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 ​​'plistify' - по сравнению с ним служебные данные базы данных минимальны.

Предполагая, что издержки могут быть связаны с созданием большого количества временных объектов ruby, я попытался заменить все это на представление и использовать Builder в представлении для создания того же XML-документа - это работает, но на самом деле в два раза медленнее!

Есть идеи, как улучшить это или иным образом выявить узкое место?

1 Ответ

1 голос
/ 08 августа 2009

Не уверен, есть ли что-то, что вы можете сделать, чтобы улучшить это, не взламывая сам драгоценный камень plist. Взглянув на исходный код из репозитория здесь "svn checkout http://plist.rubyforge.org/svn/" и здесь похоже, что гем генерирует XML самостоятельно, в отличие от использования библиотеки XML (например, LibXML, Нокогири или строитель).

Я не уверен, насколько значительным будет использование одной из этих библиотек для генерации XML (они, безусловно, быстрее разбираются) для вас, но, похоже, это первое логичное место для поиска возможностей оптимизации.

...