Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Przerzedzanie wyników na serwerze, wyciąganie co któregoś rekordu
ky3orr
post
Post #1





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 25.10.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Witam wszystkich!

zmagam sie z problemem pobierania danych do wykresu.
Chodzi o to, że użytkownik ma mozliwośc podania zakresu dat za jaki okres chce zobaczyć wykres.
Danych za ten okres moze byc kilka, a może być 100milionów.
Zakładam, że komponent wykresowy akceptuje powiedzmy 10000 punktów i tu pytanie:
-czy mozna skonstruować takie zapytanie, aby w przypoadku gdy liczba rekordów wyniku była większa niż 100tysięcy to wtedy wyciągnie tylko co niektóre (kwestia algorytmu wyliczającego co ile punktów pobierać rekord do wyniku - np. jakiś mod) tak, żeby tabela końcowa wracająca z serwera do aplikacji miała nie wiecej niż te 100tysięcy wierszy?

data zawarta w rekordach jest typu double (zmodyfikowana data julianska MJD).

jesli ktoś bawił się z takim czymś to chetnie usłyszę którędy droga (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

pozdrawiam

Ten post edytował ky3orr 29.03.2009, 01:56:47
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Puki co staram się ujarzmić kilka zapytań jednocześnie

Z racji, ze przeprowadzilem sobie wewnetrzny test, to masz juz gotowy kod:
  1. <?php
  2. $time1 = microtime(true);
  3. $sql = 'select count(*) from city_city';
  4. $res = mysql_query($sql) or die(mysql_error());
  5. $row = mysql_fetch_array($res);
  6. $count = $row[0];
  7.  
  8. $coIle = round($count/100000);
  9. echo 'Ilosc wszystkich rekordow:'.$count;
  10. echo '<br />Co ile:'.$coIle;
  11. mysql_query('SET @nr=-1, @coile='.$coIle);
  12. $res = mysql_query('select *
  13. from (select
  14.        @nr:=@nr+1    _nr,
  15.        city_city.*
  16.      from city_city) jakisalias
  17. where _nr % @coile = 0') or die(mysql_error());
  18. $i=0;
  19. while ($row = mysql_fetch_array($res)){
  20. //tu cos sobie rob z rekordem
  21. $i++;
  22. }
  23. echo '<br />Ilosc przetworzonych rekordow:'.$i;
  24. echo '<br />Czas '.(microtime(true) - $time1);
  25. ?>

A oto wynik:
Ilosc wszystkich rekordow:6359961
Co ile:64
Ilosc przetworzonych rekordow:99375
Czas 7.34749293327

A tutaj kod w wersji maly_swd:
  1. <?php
  2. $time1 = microtime(true);
  3. $res = mysql_query('select * from city_city') or die(mysql_error());
  4. $count = mysql_num_rows($res);
  5. $coIle = round($count/100000);
  6. echo 'Ilosc wszystkich rekordow:'.$count;
  7. echo '<br />Co ile:'.$coIle;
  8.  
  9. $poz = 0;
  10. $i=0;
  11. while ($row = mysql_fetch_array($res)){
  12. $poz+=$coIle;
  13. if (!mysql_data_seek($res,$poz)) break;
  14. $i++;
  15. }
  16.  
  17. echo '<br />Ilosc przetworzonych rekordow:'.$i;
  18. echo '<br />Czas '.(microtime(true) - $time1);
  19. ?>

I wynik:
Ilosc wszystkich rekordow:6359961
Co ile:64
Fatal error: Maximum execution time of 990 seconds exceeded


Jak widac tabela ma ponad 6 mln rekordow.

Dla mojej wersji skrypt wykonywał sie 7 sekund. Procesy systemowe w normie, podkoczyl jedynie troche proces mysql ale nie zuzywal wcale wiecej pamieci niz normalnie.

Dla wersji malego skrypt wykonywal sie koszmarnie dlugo. Proces apachea wskoczyl mi na maxa i zajął ponad 300MB pamieci.
Dodatkowo nie doczekalem sie na wynik. Musialem sztucznie zwiększyc $coIle na 20000 by doczekac sie wyniku. Oto on:
Ilosc wszystkich rekordow:6359961
Co ile:20000
Ilosc przetworzonych rekordow:317
Czas 20.1107699871

PRzykladowo moj skrypt dla tej wartosci $coIle uzyskal nastepujace wyniki
Ilosc wszystkich rekordow:6359961
Co ile:20000
Ilosc przetworzonych rekordow:318
Czas 7.14381098747


Wnioski: no chyba nie musze mowic.... (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

@maly_swd jesli naprawde myslales o innym rozwiązaniu to prosze podaj je dokladnie. Jesli jednak nie, to moze wkoncu przyjmiesz fakty do wiadomosci.

edit:
a, i jeszcze wyniki moich wczesniej podanych skryptow dla tej samej tabeli z 6 mln rekordow

czas dla select count(*): 0.00517010688782
czas dla mysql_num_rows: 6.46986794472

no comments.... (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post

Posty w temacie
- ky3orr   Przerzedzanie wyników na serwerze   29.03.2009, 01:50:17
- - erix   CytatDanych za ten okres moze byc kilka, a może by...   30.03.2009, 09:32:15
- - nospor   najpierw zliczasz ile masz wszystkich wierszy (zwy...   30.03.2009, 09:43:01
- - maly_swd   nospor->Malo optymalnie: wystarczy zwykle zapy...   30.03.2009, 14:17:30
- - erix   ~maly_swd, niby czemu? Twój przykład zeżre dużo wi...   30.03.2009, 17:59:37
- - nospor   Cytatnospor->Malo optymalnie:yyy, opierasz swoj...   30.03.2009, 19:15:00
- - piotrooo89   ~maly_swd stworzyłeś jakiegoś potworka pamięciożer...   30.03.2009, 19:17:28
- - ky3orr   nospor dzięki za linka. teraz muszę rozkminić jak ...   30.03.2009, 22:12:17
- - maly_swd   Twoj sposob jest dobry pod warunkiem ze znamy STEP...   30.03.2009, 23:29:26
- - nospor   CytatTwoj sposob jest dobry pod warunkiem ze znamy...   31.03.2009, 07:47:13
- - ky3orr   nospor czy, aby wykonać ten zestaw polece...   31.03.2009, 09:52:17
- - nospor   SET to jedno zapytanie kolejne linie to następne j...   31.03.2009, 09:59:53
- - dr_bonzo   @ky3orr: Query Browser pod tym wzgledem to gowno, ...   31.03.2009, 10:23:32
- - maly_swd   nospor-> widze ze nie zrozumiales tego co napis...   31.03.2009, 15:25:30
- - erix   CytatDruga sprawa ze taki wynik jest cachowany prz...   31.03.2009, 18:42:49
- - nospor   Cytatnospor-> widze ze nie zrozumiales tego co ...   31.03.2009, 20:09:00
- - ky3orr   Koledzy! nie było moją intencją skłócić kogok...   31.03.2009, 20:47:51
- - rzymek01   maly_swd, a czy czasem mysql_num_rows nie przelatu...   31.03.2009, 21:42:01
- - nospor   CytatPuki co staram się ujarzmić kilka zapytań jed...   31.03.2009, 22:00:12
- - piotrooo89   robiąć tak jak napisał ~maly_swd można w piękny sp...   31.03.2009, 22:01:57
- - nospor   Cytattestowane na 222 rekordach przy 100 tyś ...   31.03.2009, 22:06:26
- - piotrooo89   Cytat(nospor @ 31.03.2009, 23:06:26 )...   31.03.2009, 22:11:40


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 9.10.2025 - 16:29