Как Найти Ближайшее Кафе, Достопримечательность, Бесплатное Такси Глазами Программиста

Сервисы, решающие любые задачи в контексте нашего местонахождения, достаточно прочно вошли в нашу жизнь.

Большинство смартфонов, если у них есть доступ к Интернету, могут вызвать нам такси, рассчитать, во сколько прибудет автобус, проложить маршрут с учетом пробок и различных предпочтений пользователя или показать друзей поблизости.

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

В этой статье я хочу рассмотреть некоторые инструменты для решения подобных задач и сравнить их производительность друг с другом.



Постановка задачи

Необходимо выбрать способ разработки сервиса, в который пользователи периодически загружают свое местоположение, а другие пользователи ищут своих «соседей».

Примерами сервисов, решающих подобные проблемы, являются сервисы заказа такси, социальные сети и такие игры, как Вход .



Способ решения проблемы

Есть некоторое теоретическое введение в статья , подробно - в Википедии .

Далее будут рассмотрены чисто практические вопросы.

Чтобы решить проблему, для нескольких выбранных сервисов будут реализованы классы адаптеров.

Интерфейс этих адаптеров представлен в листинге:

  
  
   

from abc import ABCMeta, abstractmethod class AbstractStorage(object): __metaclass__ = ABCMeta @abstractmethod def prepare_storage_for_experiment(self, test_data): pass @abstractmethod def experiment_search(self, test_data): pass @abstractmethod def experiment_update(self, test_data): pass @abstractmethod def clear_storage(self): pass

Измерение времени осуществляется с помощью Профильные крючки .



Принятые упрощения

  1. Здесь и далее весь код написан на Python; Все описанные ниже инструменты можно использовать из других распространенных языков программирования, если не указано иное.

    Возможность ускорить работу системы путем переписывания всего на более быстрый язык программирования типа c/c++ не будет рассматриваться в рамках данной статьи, хотя вполне может быть использована в боевых условиях, если осуществимость такого решения будет доказана.

    доказано.

  2. В приведенной выше системе все запросы обрабатываются последовательно, что эквивалентно наличию очереди запросов перед рассматриваемым модулем и модулем, работающим в одном потоке; При использовании системы в бою разработанный модуль, скорее всего, будет обрабатывать запросы в несколько потоков.

  3. Все тесты проводятся на ноутбуке со следующим железом: 8 Гб ОЗУ, Intel Core i5 2,6 ГГц, SSD. Конфигурация оборудования сервера, скорее всего, будет другой.

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

    Настройка выбранных инструментов в данной статье рассматриваться не будет.



Выполнение

Строка (документ или другая – в зависимости от принятой терминологии) состоит из id и пары координат во внутреннем представлении системы.

Для каждого столбца строится индекс, если система это позволяет. Все реализации будут предоставлять код, отвечающий за поиск и обновление.

Ссылка на полный код проекта на github будет приведена в конце статьи.



Реализация 1. MongoDB v3.2.6.
Ссылка на документацию по геопоиску Код, отвечающий за тестирование скорости поиска и обновления:

@timecall(immediate=True) def experiment_search(self, test_data): def find_point(point): cursor = self.collection.find( { MongoStorage.key_position: { '$near': { '$geometry': { 'type': "Point", 'coordinates': [point['lng'], point['lat']] }, '$maxDistance': 10000 } } } ) return cursor[0] if cursor.count() > 0 else None @timecall(immediate=True) def experiment_update(self, test_data): for t in test_data: self.collection.update_one( { MongoStorage.key_id: t["id"] }, { '$set': { MongoStorage.key_position: { 'type': "Point", 'coordinates': [t['position']['lng'], t['position']['lat']] } } } )

Объясните поисковый запрос:

{

Теги: #geo #mongodb #postgresql #redis #postgresql #mongodb #Геоинформационные сервисы
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.