Я создаю каталог для поиска спортивных турниров по GAE с
web2py и внешний интерфейс Flex. Пользователь выбирает местоположение, радиус и максимум
дата из набора вариантов. У меня есть базовая версия этого запроса, но это
неэффективно и медленно. Один способ, которым я знаю, что могу улучшить это, конденсируя
много отдельных запросов, которые я использую, чтобы собрать объекты в
массовые запросы. Я только что узнал, что это возможно. Но я также думаю о более обширном редизайне, использующем memcache.
Основная проблема в том, что я не могу запросить хранилище данных по местоположению
потому что GAE не позволяет несколько операторов числового сравнения
(<, <=,> =,>) в одном запросе. Я уже использую один для даты, и мне нужно
ДВА, чтобы проверить широту и долготу, так что не стоит. В настоящее время,
мой алгоритм выглядит так:
1.) Запросите по дате и выберите
2.) Используйте функцию назначения из модуля расстояния geopy, чтобы найти
максимальная и минимальная широта и долгота для заданного расстояния
3.) Просмотрите результаты и удалите все с широтой / долготой за пределами макс / мин.
4.) Переберите снова и используйте функцию расстояния, чтобы проверить точное
расстояние, потому что шаг 2 будет включать в себя некоторые области за пределами радиуса.
Удалить результаты за пределами предоставленного расстояния (это комбинация 2/3/4
inefficent?)
5.) Соберите списки «многие ко многим» и прикрепите к объектам (это где я
нужно перейти на массовые операции)
6.) Возврат к клиенту
Вот мой план использования memcache .. дайте мне знать, если я ухожу влево
поле на этом, так как у меня нет опыта работы с memcache или сервером
кеширование вообще.
-Сохранить список в кеше, заполненном «геообъектами», которые представляют все
мои данные. У них есть пять свойств: широта, долгота, event_id,
event_type (в ожидании выхода за пределы турниров) и
Дата начала. Этот список будет отсортирован по дате.
-Также держите указатели в кеше, которые представляют начало
и конец индексов в кеше для всех диапазонов дат, используемых моим приложением (далее
неделя, 2 недели, месяц, 3 месяца, 6 месяцев, год, 2 года).
-Имеет запланированное задание, которое обновляет указатели ежедневно в 12 часов утра.
-Добавить новые вставки в кеш, а также в хранилище данных; Обновить
указатели.
Используя этот дизайн, алгоритм теперь будет выглядеть так:
1.) Используйте указатели, чтобы вырезать соответствующий фрагмент списка на основе
Дата поставки.
2-4.) Тот же алгоритм, что и выше, за исключением геообъектов
5.) Используйте массовую операцию, чтобы выбрать полные турниры, используя оставшиеся гео
event_ids объекта
6.) Соберите много-к-человеку
7.) Возврат к клиенту
Мысли об этом подходе? Большое спасибо за чтение и любые советы вам
могу дать.
- датчанин