Python GeoModel альтернатива - PullRequest
       32

Python GeoModel альтернатива

6 голосов
/ 22 октября 2010

Я ищу альтернативную библиотеку для хранилища данных движка приложений, которая будет выполнять ближайшие-n или коробочные гео-запросы, в настоящее время я использую GeoModel 0.2, и она работает довольно медленно (в некоторых случаях> 1.5 с).У кого-нибудь есть предложения?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 22 октября 2010

У меня такая же проблема с геомоделью.Чтобы исправить это, я использую разрешение 4, и я использую отсортированный питон и фильтр.

SEARCHED_LOCATION = db.GeoPt("48.8566667, 2.3509871") # Location of Paris.
DISTANCE = 50000 #Between 10000 and 150000.
MAX_RESULTS = 300

# Resolution '4' is about 150 kilometers i suppose it's a good compromise.                                                                                                                            
bbox = geocell.compute_box(geocell.compute(SEARCHED_LOCATION, resolution=4))
cell = geocell.best_bbox_search_cells(bbox, geomodel.default_cost_function)

query.filter('location_geocells IN', cell)

# Python filters
def _func(x):
  """Private method used to set the distance of the model to the searched location
  and return this distance.
  """
  x.dist = geomath.distance(SEARCHED_LOCATION, x.location)
  return x.dist

results = sorted(query.fetch(MAX_RESULTS), key=_func) # Order the result by distance
results = [x for x in results if x.dist <= DISTANCE]  # Filter the result
4 голосов
/ 23 ноября 2010

Вместо использования выпуска geomodel 0.2.0 используйте ветвь withasync (см.

http://code.google.com/p/geomodel/source/browse/#svn/branches/withasync).. Это позволит вам выполнять запросы параллельно, используя asynctools, что будет значительно быстрее для многихзапросы.

Убедитесь, что в вашем приложении / pythonpath также есть asynctools.

2 голосов
/ 22 октября 2010

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

Например, если вам не нужен ближайший-n, вам просто нужны результаты X из определенного ограничивающего прямоугольника или радиуса, вы, вероятно, можете улучшить скорость GeoModel, поскольку GeoModel в настоящее время должна получать каждую запись всоответствующий geohash, а затем сортирует по ближайшему в памяти.(Подробности этой реализации оставлены в качестве упражнения для читателя.)

Вы также можете подумать о настройке того, сколько уровней геохеша вы используете.Если у вас много плотных данных и вы делаете запросы по небольшим областям, вы можете значительно повысить производительность, сохранив 16 уровней вместо 8 или 12.

(я сейчас не смотрю на источник GeoModel, но вспоминаюкогда я последний раз использовал его несколько месяцев назад, так что возьмите это с крошкой соли и погрузитесь в исходный код самостоятельно.)

...