Najlepszy system GIS dla aplikacji internetowych o wysokiej wydajności - PostGIS vs MongoDB

36

Pracuję nad aplikacją internetową / mobilną opartą na danych lokalizacji. Ponieważ już znam MongoDB, stwierdziłem, że indeksowanie geoprzestrzenne mongo jest całkiem odpowiednie dla moich potrzeb. Ponieważ mam głównie do czynienia z prostymi / krótkimi punktami lokalizacji, indeksowanie Mongo 2d jest dla mnie dobre.

Po drodze wybrałem PostGIS, ponieważ jest stabilny / dojrzały. I jego niesamowity zestaw funkcji. Ale moim głównym zmartwieniem jest wydajność, ponieważ moje dane są silnie zależne od lokalizacji (przeważnie 70 - 80% połączeń db zajmuje się lokalizacją).

Lubię mongo, ponieważ jest już używane przez aplikacje internetowe o wysokiej wydajności, takie jak foursquare. Ale widziałem, że PostGIS jest wykorzystywany głównie w projektach rządowych / korporacyjnych (głównie w aplikacjach innych niż web / mobile). Więc jestem teraz trochę zdezorientowany, aby wybrać odpowiednią bazę danych GIS dla mojej aplikacji internetowej / mobilnej? Masz jakieś sugestie?

RameshVel
źródło
2
utwórz indeks przestrzenny za pomocą postgres / postgis, a zobaczysz dobrą wydajność. Ale jeśli jesteś zadowolony z MongoDB, kontynuuj to.
Mapperz

Odpowiedzi:

36

Jeśli obciążenie zapisu (przychodzący strumień danych) może potencjalnie rosnąć bez ograniczeń (jeśli sukces projektu internetowego spowoduje wzrost liczby zapisów, będzie rosnąć), przejdź do Mongo, ponieważ bardzo trudno będzie stworzyć architekturę napisz wąskie gardło w PostGIS / PostgreSQL, gdy wykroczysz poza możliwości pojedynczego serwera wysokiej klasy (które, jak można zauważyć, są naprawdę duże).

Możesz zaprojektować dobre rozwiązania PostGIS / PostgreSQL dla dużego obciążenia odczytu (replikacja master / slave) i dla dużych rozmiarów danych (partycjonowanie tabel), ale obciążenie zapisu jest trudne. Już przedstawiłeś sprawę przeciwko Mongo i PostGIS, który jest znacznie większym zestawem funkcji i dojrzałością kodu PostGIS, więc zrównoważ to z innymi obawami.

Paul Ramsey
źródło
3
Aha, i pamiętajcie, „MongoDB jest skalą internetową”. xtranormal.com/watch/6995033/mongo-db-is-web-scale
Paul Ramsey
tak, wiem, że .. to było naprawdę zabawne (i uderzyło cię prosto w głowę, jeśli chcesz po prostu
spróbować swoich sił
1
Cóż, zawsze możesz „przeskalować” poprzez wyłączenie fsync = off;)
Ragi Yaser Burhum
1
PostgresXC może teraz zapewnić równoległy system zapisu z pełną gwarancją transakcji i wykonywaniem zapytań w wielu węzłach. Pas i szelki, OLAP i OLTP, warte obejrzenia. I obsługuje PostGIS.
Paul Ramsey,
Ale jeśli wybierzesz PostgresXC / XL, musisz samodzielnie zachować pakiet. Jest oficjalnie dostępny tylko dla Fedory / Redhat, miłośnicy Ubuntu muszą spędzać czas na ręcznym kompilowaniu rzeczy.
Ravi Kumar
21

Używam PostGIS od kilku lat i dopiero niedawno zacząłem badać, w jaki sposób mogę wykorzystać MongoDB do radzenia sobie z niektórymi przypadkami użycia. Miałem do czynienia z danymi punktowymi, które miały rzadkie pola - jak dane OSM ze zmienną liczbą znaczników na rekord, a ponieważ MongoDB nie ma schematu, dobrze do tego pasuje. Załadowałem próbkę tych danych do instancji każdego DB i oto, co znalazłem.

Wydaje mi się, że w przypadku prostego przechowywania i pobierania danych punktowych Mongo działa dobrze. Zapytania geoprzestrzenne z obwiednią wydają się działać dobrze i uważam, że ogólna wydajność jest bardzo dobra. Jest także bardzo łatwy w konfiguracji i rozpoczęciu pracy, chociaż odkryłem, że narzędzie mongoimport nie pozwala mi zdefiniować złożonego pola współrzędnych 2D w pliku TSV lub CSV. Ponieważ napisanie skryptu generującego JSON jest dość łatwe, nie stanowiło to większego problemu. Jego główną wadą jest obecnie to, że prawie nic innego w sferze geoprzestrzennej nie może natywnie odczytać z niego danych. Wygląda na to, że istnieje eksperymentalna wtyczka źródła danych Mapnik na https://github.com/springmeyer/mapnik-mongo , ale to wszystko, co mogłem znaleźć.

Z drugiej strony PostGIS zajmuje trochę więcej czasu (przynajmniej dla mnie), ale jak wspomniano powyżej, zapewnia znacznie więcej funkcji od razu po wyjęciu z pudełka. Oprócz zapewnienia znacznie bardziej wyrafinowanych możliwości analizy przestrzennej, jest on również natywnie obsługiwany przez mnóstwo innych aplikacji i bibliotek; Mapserver, Mapnik, QGis, GDAL itp. Itd. Dla mnie PostGIS jest bardziej prawdziwym systemem GIS, niż prostym systemem przechowywania i wyszukiwania.

Jeśli chodzi o wydajność, stwierdziłem, że mogę bardzo szybko pobierać dane z obu systemów. Wydawało się jednak, że PostGIS bardziej skorzystał na obecności indeksów. MongoDB był nieco szybszy w zwróceniu mi całego zestawu danych naraz (2 miliony rekordów) i nieco wolniejszy w zwróceniu zapytania, które wykorzystało indeks - za pierwszym razem. Nie jestem do końca pewien mechanizmu, który wykorzystuje do buforowania, ale widzę, że jeśli powtórzę zapytanie w MongoDB, wyniki pojawią się znacznie szybciej za drugim razem. Widzę coś podobnego w PostGIS, ale nie w tym samym stopniu. Zauważyłem również, że użycie pamięci na moim komputerze wydaje się być znacznie wyższe przy uruchomionym MongoDB niż w PostGIS.

Zatem doszedłem do wniosku, że nie pozbędę się PostGIS jako mojego domyślnego systemu przechowywania i analizy geoprzestrzennej, ale w przypadku niektórych rodzajów projektów (mianowicie map internetowych wyświetlających kafelki obrazów i / lub dane punktowe) mogę rozważyć użycie MongoDB jako mój magazyn danych.

zrozumiałem

lagerratrobe
źródło
1
całkowicie się z tobą zgadzam .. mongo to bardzo dobra opcja do obsługi podstawowych danych Geo. obecnie robię prostsze zapytania sferyczne i ograniczające, i ma się dobrze. Jeszcze jedną rzecz, którą chcę dodać, jest Solr Lucene, który zapewnia również podstawowe funkcje geo jako mongo, i jest dość szybki, gdy używa się zapytań fasetowanych. currenlty używam kombinacji zarówno mongo i Solr ..
RameshVel
@RameshVel, czy możesz powiedzieć coś więcej na temat Solr Lucene?
rkm
@rashad, możesz zainstalować elasticsearch (wystarczy pobrać, wyodrębnić i gotowe) i grać z zapytaniami Geo DSL. Jest dość prosty, ale jeśli chcesz wyszukiwać / aspekty, a także geo, możesz go użyć.
Ravi Kumar,
3

Jeśli chodzi o wykorzystanie pamięci w Mongo, warto zauważyć, że Mongo polega całkowicie na pamięci podręcznej plików systemu operacyjnego, aby pobierać swoje indeksy i dane do pamięci - nie ma koncepcji „bufora pamięci / pamięci podręcznej indeksu”, więc zobaczysz, że spróbuje (lub raczej system operacyjny wykorzysta całą dostępną pamięć RAM do momentu buforowania wszystkich plików danych.

Patrick Vale
źródło