Сервисы, решающие любые задачи в контексте нашего местонахождения, достаточно прочно вошли в нашу жизнь.
Большинство смартфонов, если у них есть доступ к Интернету, могут вызвать нам такси, рассчитать, во сколько прибудет автобус, проложить маршрут с учетом пробок и различных предпочтений пользователя или показать друзей поблизости.
Задачи вроде поиска ближайшего кафе или достопримечательности стали для них тривиальными и обычно могут быть решены без какого-либо доступа во Всемирную паутину.
В этой статье я хочу рассмотреть некоторые инструменты для решения подобных задач и сравнить их производительность друг с другом.
Постановка задачи
Необходимо выбрать способ разработки сервиса, в который пользователи периодически загружают свое местоположение, а другие пользователи ищут своих «соседей».Примерами сервисов, решающих подобные проблемы, являются сервисы заказа такси, социальные сети и такие игры, как Вход .
Способ решения проблемы
Есть некоторое теоретическое введение в статья , подробно - в Википедии .Далее будут рассмотрены чисто практические вопросы.
Чтобы решить проблему, для нескольких выбранных сервисов будут реализованы классы адаптеров.
Интерфейс этих адаптеров представлен в листинге:
Измерение времени осуществляется с помощью Профильные крючки .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
Принятые упрощения
- Здесь и далее весь код написан на Python; Все описанные ниже инструменты можно использовать из других распространенных языков программирования, если не указано иное.
Возможность ускорить работу системы путем переписывания всего на более быстрый язык программирования типа c/c++ не будет рассматриваться в рамках данной статьи, хотя вполне может быть использована в боевых условиях, если осуществимость такого решения будет доказана.
доказано.
- В приведенной выше системе все запросы обрабатываются последовательно, что эквивалентно наличию очереди запросов перед рассматриваемым модулем и модулем, работающим в одном потоке; При использовании системы в бою разработанный модуль, скорее всего, будет обрабатывать запросы в несколько потоков.
- Все тесты проводятся на ноутбуке со следующим железом: 8 Гб ОЗУ, Intel Core i5 2,6 ГГц, SSD. Конфигурация оборудования сервера, скорее всего, будет другой.
- Все используемые инструменты будут использоваться с конфигурацией по умолчанию, за исключением того же объема выделенной оперативной памяти (где этот момент можно настроить стандартными средствами).
Настройка выбранных инструментов в данной статье рассматриваться не будет.
Выполнение
Строка (документ или другая – в зависимости от принятой терминологии) состоит из 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 #Геоинформационные сервисы
-
Dotnext 2016: Между Настоящим И Будущим
19 Oct, 24 -
Сш. Давайте Запомним Пароль.
19 Oct, 24 -
Используйте Подсветку Кода
19 Oct, 24