6

Poszukuję alternatywnej biblioteki dla magazynu danych silnika aplikacji, która zrobi najbliższe-n lub pudełkowe zapytania geograficzne, obecnie używam GeoModel 0.2 i działa dość wolno (> 1.5s w niektórych przypadkach). Czy ktoś ma jakieś sugestie?Python GeoModel alternatywa

Dzięki!

Odpowiedz

6

Mam taki sam problem z geomodelem. Dla poprawności, używam rozdzielczości 4 i używam pytona posortowanego i filtra.

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 
2

Nie mogę wskazać ci istniejącej biblioteki, która ma lepszą wydajność, ale jak pamiętam, GeoModel jest open source i kod nie jest trudny do zrozumienia. Odkryliśmy, że możemy wprowadzić pewne poprawki prędkości, dostosowując kod do naszego scenariusza.

Na przykład, jeśli nie potrzebujesz najbliższej-n, potrzebujesz tylko wyników X z określonego obwiedni lub promienia, prawdopodobnie możesz poprawić prędkość GeoModel, ponieważ GeoModel musi obecnie uzyskać każdy rekord w odpowiednim geohashu a następnie sortuje w pamięci najbliżej. (Szczegóły tej implementacji pozostawione jako ćwiczenie dla czytnika.)

Możesz również rozważyć dostrojenie ilości poziomów geohash, których używasz. Jeśli masz dużo gęstych danych i przeszukujesz małe obszary, możesz znacznie zwiększyć wydajność, zachowując 16 poziomów zamiast 8 lub 12.

(Nie patrzę teraz na źródło GeoModel, ale pamiętam, kiedy ostatnio używał go kilka miesięcy temu, więc weź to z przymrużeniem oka i zanurz się w kodzie źródłowym.)