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?
Odpowiedzi:
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.
źródło
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
źródło
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.
źródło