Eredmény: 1 - 7 (7) összesen

Téma: Közelben lévő pontok számítása ( Mysql )

  1. #1
    Net vadász nagysanyi logója
    Csatlakozott
    09-04-11
    Hely
    Budapest
    Hozzászólás
    483
    Begyűjtött 0 köszönetet
    0 hozzászólásával

    Kérdés Közelben lévő pontok számítása ( Mysql )

    Az lenne, a kérdésem, hogy tudna-e nekem valaki ajánlani ennél gyorsabb megoldást erre a feladatra.
    Előre is köszönöm a segítségeteket.

    Kód:
    SELECT *, (ACOS((SIN($latitude_p/57.295) * SIN(latitude/57.295))+(COS($latitude_p/57.295) * COS(latitude/57.295) * COS(longitude/57.295 ($longitude_p)/57.295))))
    *
    3963 AS
    distance
    FROM 
    tabla_name
    WHERE (latitude >= $latitude_p - 0.5)AND(latitude <= $latitude_p + 0.5)AND(longitude >= ($longitude_p) - 0.5)AND (longitude <= ($longitude_p) +0.5)
    ORDER BY distance ASC limit 100000




  2. #2
    Bölcs ARTidas logója
    Csatlakozott
    09-09-15
    Hely
    Budapest
    Hozzászólás
    1.465
    Thanked 1 Time in 1 Post

    Alapbeállítás re: Közelben lévő pontok számítása ( Mysql )

    Mi lenne, ha egy új oszlopot hoznál létre a táblán belül, ahol ezen értékek készen ki vannak számolva? Ha nagyon sokat kérdezed ezt le, sokkal jobb, ha feldolgozott adatot tárolsz.

    Szedd az eredményt külön oszlopba!

    Vagy egy CRON (időzített PHP futtatás) -nal naponta végigpásztázod és újra számoltatod a táblát, ha mégis változna.

    Az SQL serverek, nem ilyen szintű aritmetikai műveletekre vannak felkészítve, mert egy ilyen futtatás kapásból soronként 14 flop (floating point operation) és ha erre van 100 000 000 sorod, az már alapból 1 giga flop az intel xeon ~64 giga flop/sec -es sebességéből (ami tűrhetően gyorsnak számít)... egy tábla lekérdezés a processzor másodpercenkénti összteljesítményének az 1/60 -ad rész (az k*rva sok...) és még mellette le kell szolgálnia a többi query -t, adatbázis motort és operációs rendszert, etc...

    Cheers,



  3. #3
    Új tag
    Csatlakozott
    11-01-22
    Hozzászólás
    9
    Begyűjtött 0 köszönetet
    0 hozzászólásával

    Alapbeállítás re: Közelben lévő pontok számítása ( Mysql )

    Az ilyesmit tudtommal söprésnek nevezett algoritmusokkal szokták megoldani. Mivel feltételezem, nem áll módodban egy kiegészítést telepíteni az adatbázisszerverre - és mert egyébként sem lenne egyszerű - szerintem valamilyen gyorsítótárazás lehet a megoldás kulcsa. Viszont, ha van 1000 pontod, amik gondolom minden síkon legalább 1-1 bájtos koordinátával rendelkeznek - akkor egy egy távolság eltárolásához szükséged lesz legalább 2-2 bájtra, továbbá a távolság leírásához legalább egy bájtra(de inkább egy lebegőpontos számra, ha számít valamit is a pontosság - rendezés esetén biztosan.), tehát "kézfogásonként" minimum öt bájt. Mivel 1000 távolságot kell eltárolnod, ezért 1000 alatt a 2 sorra lesz szükséged. (azaz 499500 ha jól számoltam), ami már magában 2,38 megabájt(ha a lehető legoptimálisabb tárolási módszert nézzük - de annyira nem ástam megam bele a MySQL-be, hogy tudjam ez hogyan történik.). Viszont neked egész biztosan nem ilyen kis kiterjedésű és pontatlan értékekre lesz szükséged, vagyis ennek a többszörösével számolhatsz, ami a pontok számának növekedésvel csaknem exponenciálisan nő - tehát sem kicsi, sem gyors nem lesz az adatbázis. Százezer pont esetén sajnos már 23 gigabájtot emésztene fel ez a tábla.

    Tehát nem javaslom, hogy ezt a módszert sok pont esetén használd. Biztos lehet még a bruteforce módszeren is javítani. Ha leírnád, hogy konkrétan milyen probléma megoldásához lenne erre szükség, akkor lehet hogy többet tudnánk segíteni. Mindenesetre amikor csak lehet, kerüld ennek a lekérdezének a lefuttatását. Amint már fentebb írták 1-2 művelet megspórolható a fenti módszer finomításával, de erre be kell áldozni némi tárhelyet, ami összeségében ugye megint egy kis sebességveszteség okozója lehet.



  4. #4
    Net vadász nagysanyi logója
    Csatlakozott
    09-04-11
    Hely
    Budapest
    Hozzászólás
    483
    Begyűjtött 0 köszönetet
    0 hozzászólásával

    Alapbeállítás re: Közelben lévő pontok számítása ( Mysql )

    Azt mondjátok, hogy kénytelen vagyok eltárolni inkább a kiszámított adatot .
    Nem nagyon szeretném, mert rengeteg helyet használna .

    2.6 millió pont van.



  5. #5
    Új tag
    Csatlakozott
    11-01-22
    Hozzászólás
    9
    Begyűjtött 0 köszönetet
    0 hozzászólásával

    Alapbeállítás re: Közelben lévő pontok számítása ( Mysql )

    Idézet nagysanyi eredeti hozzászólása Hozzászólás megtekintése
    2.6 millió pont van.
    Természetesen ebben az esetben szóba sem jöhet a kombinációk eltárolása. A fentebb említettmódszer segíthet valamit, néhány megabájt árán.

    De tényleg jobb lenne, ha többet elmondanál a problémáról.



  6. #6
    Bölcs ARTidas logója
    Csatlakozott
    09-09-15
    Hely
    Budapest
    Hozzászólás
    1.465
    Thanked 1 Time in 1 Post

    Alapbeállítás re: Közelben lévő pontok számítása ( Mysql )

    2 választási lehetőség van:

    Vagy fizikailag növeled az adatbázist és külön oszlop lesz az eredményekhez,
    Vagy cachelteded és a gép memóriáját használod fel tároláshoz.

    A fizikai mentést támogatom, mivel ez a megoldás nem fogja annyira gyilkolni és lassítani. 2 milla adatot még teljesen tűrhető lekérdezni... főleg ha nem MsSQL -elt használsz hozzá

    Több száz megabyte cacheltetése lelassítja az egész SQL servert, mivel memóriában tárolja... (főleg ha osztott serveren vagy, mert akkor pár 100 mega az, ami neked jut összesen...)

    Cheers,



  7. #7
    Bölcs
    Csatlakozott
    07-08-28
    Hozzászólás
    1.023
    Begyűjtött 146 köszönetet
    105 hozzászólásával

    Alapbeállítás re: Közelben lévő pontok számítása ( Mysql )

    Alapvetően 2 felé bontanám a kódot. A mysql lassan számol, és ráadásul fölöslegesen sok sallangot gyüjt maga köré.

    Első lépésben php-ban kiszámoltatnék mindent ami a where részben van, hogy minél könnyebben lefusson az sql query. Igy ráadásul jobban ki lehet hasznáni a célzott indexeket. Utánna php-ből számolnám hozzá a távolságot, hiszen ott is rengeteg értéket előre ki lehet számoltatni, ami nagyban megkönnyiti a számolást.

    A távolság szerinti sorbarendezést pedig valahogy igy oldanám meg:
    PHP kód:
    # $pontok az összes az sql-ből kiszedett adat.
    $runner 1;
    foreach (
    $pontok as $pont)
    {
    $pont['distance'] = 1+// itt jön a számoló rész.
    $final[$pont['distance'] . '-' $runner] = $pont;
    }
    ksort($final); 
    Igy összetettebb lessz a kódod, viszont több mindent tudsz a memóriában csinálni, igy haladósabb lessz. Ráadásul webszervert sokkal könnyebb bővíteni mint mysql szervert


    Utoljára módosítva: TLoF által : 2011-01-31 21:13 Oka: Lemaradt a konkluzió

A téma címkéi:

Könyvjelzők

Hozzászólás szabályai

  • Új témákat nem hozhatsz létre
  • Válaszokat nem küldhetsz
  • Fájlokat nem csatolhatsz
  • A hozzászólásaidat nem módosíthatod
  •