Оптимизация на огромных генерирующих XML? - PullRequest
1 голос
/ 08 ноября 2010

В настоящее время я разрабатываю приложение rails, которое генерирует xml для полноценного веб-сервиса.Мое xml представление веб-сервиса использует gem nokogiri для генерации формата xml, который соответствует ожидаемому формату от клиента.Но проблема в том, что данные достаточно большие - около 50 000 записей, которые нужно извлечь из таблицы (миллионы записей).Я просто тестирую на своем локальном компьютере, получение ответа на запрос занимает около 20 минут.

Есть ли у вас какие-либо идеи по поводу оптимизации этой проблемы?Другой вариант, я не уверен, что если мы не будем использовать ActiveRecord, а мы просто используем чистый SQL-оператор для извлечения данных для генерации XML, тогда производительность будет намного выше или нет?

1 Ответ

1 голос
/ 09 марта 2011

Одно из возможных решений - изучить идею нумерации страниц .Пагинация вернет подмножество ваших исходных результатов.Абоненты вашей службы будут делать несколько запросов к вашей службе для получения всех желаемых записей.

Пагинация будет иметь ряд преимуществ, вот лишь несколько

  1. Initial FasterВремя ответа на вызовы API
  2. Процесс на стороне сервера будет занимать меньше памяти, поскольку вы не сохраняете 50К результатов в памяти за один раз
  3. Позволяет звонящим извлекать только часть данныхпри желании

Пример практики разбивки на страницы

Пользователи API Twitter сталкиваются с похожей ситуацией, когда хотят вернуть всех последователей данного пользователя.,Твиттер использует концепцию курсора , чтобы предоставлять результаты в разбивке по страницам.Использование параметра курсора позволяет возвращать всех подписчиков без генерации больших запросов.

Ссылка на API Twitter:

http://apiwiki.twitter.com/w/page/22554748/Twitter-REST-API-Method:-statuses%C2%A0followers

Из документации API:

курсор.Необязательный.Разбивает результаты на страницы.Одна страница содержит 100 пользователей.Это рекомендуется для пользователей, за которыми следуют многие другие пользователи.Укажите значение -1, чтобы начать пейджинг.Укажите значения, которые возвращены в атрибутах next_cursor и previous_cursor тела ответа, для перехода по странице вперед и назад в списке.

...