![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 0 Dołączył: 9.10.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Chciałbym zapytać czy jest w Symfony2 jakiegoś gotowe rozwiązanie które umożliwia bardzo szybkie preszukiwanie punktów i obszarów. Przykładem może być sprawdzenie które z zadanych punktów znajdują się w zadanych obszarach (jest 5000 punktów i 500 obszarów - każdy punkt musi przejść przez każdy obszar) Podkreślam, że jednocześnie może być zadane bardzo dużo punktów i obszarów. Punkty i obszary przetrzymywane są w MYSQL , gdzie współrzędne są typem GEOMETRY. BYć może lepiej to robić na poziomie bazy danych, jeśli tak to jak. Pozdrawiam |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 240 Pomógł: 278 Dołączył: 11.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
"point in polygon mysql" + Google
-------------------- |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 0 Dołączył: 9.10.2007 Ostrzeżenie: (0%) ![]() ![]() |
Ale ja wiem jak wygląda zapytanie które pozwoli to sprawdzić ale (tak jak pisałem wcześniej) biorąc pod uwagę ilość danych to musiałaby się wykonać ogromna ilość zapytań a ja pytam o optymalne rozwiązanie dla sprawdzenia właśnie ogromnej ilości danych.
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 240 Pomógł: 278 Dołączył: 11.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
Co masz na myśli mówiąc ogromna ilość danych - 5000 punktów i 500 obszarów? To nie tak dużo.
Ile czasu zajmuje Ci aktualnie wykonanie zapytania które sprawdza te 5000 punktów na 1 obszarze? Elasticsearch posiada też takie możliwości i działa szybciej od MySQL - możesz go sobie przetestować. -------------------- |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 0 Dołączył: 9.10.2007 Ostrzeżenie: (0%) ![]() ![]() |
Sprawdzenie około 12,5 tyś punktów w jednym obszarze zajmuje około 6 sekund, natomiast gorzej jest jeśli chcę sprawdzić np. podobną ilość punktów w 500 obszarach.
Mam wrażenie że to się nie chce skończyć. Moje zapytanie wygląda w ten sposób:
i podając id obszaru (ob.id) tak jak wyżej zapytanie wykonuje się w kilka sekund, natomiast pomijając ten warunek i szukając we wszystkich obszarach jest już źle. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 240 Pomógł: 278 Dołączył: 11.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
Te punkty i obszary są stałe?
Jeżeli tak możesz stworzyć nową tabele o strukturze: - obszar_id - gps_id - contains TINYTINY(1) Napisać skrypt który wypełni ją danymi tj. 6 250 000 rekordami i zmienić zapytanie, tak aby nie korzystało już z funkcji CONTAINS tylko z tej tabeli. Indeks UNIQUE na obszar_id i gps_id. Jeżeli punkty nie są stałe a obszary tak, możesz zrobić automatycznie usuwanie rekordów z tej tabeli po usunięciu punktu (tylko założ indeks na gps_id) i jakieś kolejkowanie przy dodawaniu punktu tak aby cron zaczął obliczać contains jak najwcześniej. Jeszcze jest opcja, że mając w obszarze GEOMETRY które zajmuje dla każdego rekordu np. 100 kB możesz zrobić kolejne pole o nazwie np. geo_2 które będzie zawierało odchudzona wersję tego kształu np. do 1/10 - dokładność będzie mniejsza ale szybkość powinna wzrosnąć. Ten post edytował markuz 15.07.2016, 10:02:18 -------------------- |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 0 Dołączył: 9.10.2007 Ostrzeżenie: (0%) ![]() ![]() |
Rzeczy w tym, ze te dane są dynamiczne i jest ich znacznie więcej. Przykład który podałem zawiera tylko zakres wyszukiwanych danych.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 1 240 Pomógł: 278 Dołączył: 11.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
A do czego to wszystko służy? Może obrałeś złe założenia i da sie to zrobić w inny sposób.
Podaj konkretnie jak dynamiczne, jak często się zmieniają i ile ich moze być.. Na słabym komputerze nie odpalisz dobrej gry, może rozwiązaniem są chmury obliczeniowe skoro zależy Ci na szybkim czasie? -------------------- |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 0 Dołączył: 9.10.2007 Ostrzeżenie: (0%) ![]() ![]() |
Jeśli chodzi o punkty to wpływają one regularnie co minutę do bazy. Natomiast obszary zmieniają się znacznie rzadziej ale tu nie jestem w stanie określić jak często.
Celem który chcę osiągnąć jest szybkie sprawdzenie w dowolnej chwili czy dany zakres punktów zawierał się w zadanych obszarach. Ten zakres punktów może być dowolny (od kilkuset do kilkunastu tysięcy), natomiast liczba obszarów nie powinna przekraczać kilkaset. |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 1 240 Pomógł: 278 Dołączył: 11.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
Ja widzę 3 rozwiązania które już Ci wyżej podałem.
1. Stworzyć dodatkową tabelę która trzyma cache punktów w obszarach, przy dodawaniu punktu ustawiać pole np. "cache" na 0, to samo w obszarach dodatkowe pole cache na "0" - potem stworzyć skrypt który szuka danych gdzie cache = 0, oblicza dane i dodaje do tej dodatkowej tabeli. Przy usuwaniu punktów/obszarów kolejny skrypt który czyści dane z tej dodatkowej tabeli. 2. Przenieść to wszystko do elasticsearch, postawić na kilku VPS/dedykach dodatkowe node do obliczeń - jak dobrze wszystko skonfigurujesz to będzie działać szybko. 3. Zwiększyć moc obliczeniową serwera na którym stoi baza danych. Odnieś się do każdego - co Cię powstrzymuje przed jego wykorzystaniem. Ten post edytował markuz 15.07.2016, 13:51:41 -------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 13:48 |