У нас есть часть нашего приложения, которой нужно загрузить большой набор данных (> 2000 объектов) и выполнить вычисления на этом наборе. Размер каждого объекта составляет около 5 КБ.
В нашей начальной, наивной реализации узким местом является время, необходимое для загрузки всех объектов ( ~ 40 секунд для 2000 объектов ), тогда как время, необходимое для выполнения самого вычисления, очень маленький (<1 секунда). </p>
Мы попробовали несколько стратегий для ускорения поиска сущностей:
- Разделение поискового запроса на несколько параллельных экземпляров с последующим объединением результата: ~ 20 секунд для 2000 объектов .
- Хранение сущностей в кеше в памяти, помещенном в резидентный сервер: ~ 5 секунд для 2000 сущностей .
Вычисления должны выполняться динамически, поэтому предварительное вычисление во время записи и сохранение результата не работает в нашем случае.
Мы надеемся, что сможем получить ~ 2000 объектов за одну секунду. Это в пределах возможностей GAE / J? Какие-нибудь другие стратегии, которые мы могли бы реализовать для такого рода поиска?
ОБНОВЛЕНИЕ: Предоставление дополнительной информации о нашем сценарии использования и результате распараллеливания:
- У нас в хранилище данных более 200 000 объектов одного типа, и операция только для поиска.
- Мы экспериментировали с 10 параллельными рабочими экземплярами, и типичный результат, который мы получили, можно увидеть в этой пасте . Похоже, что сериализация и десериализация, необходимые при передаче объектов обратно в главный экземпляр, снижают производительность.
ОБНОВЛЕНИЕ 2: приводим пример того, что мы пытаемся сделать:
- Допустим, у нас есть объект StockDerivative, который необходимо проанализировать, чтобы узнать, является ли это хорошей инвестицией или нет.
- Выполненный анализ требует сложных вычислений, основанных на многих факторах, как внешних (например, предпочтения пользователя, рыночные условия), так и внутренних (т. Е. Из свойств объекта), и выдает единственное значение "инвестиционного балла".
- Пользователь может запросить сортировку производных по его инвестиционному баллу и попросить предоставить N-число производных с наибольшим количеством баллов.