TwojePC.pl © 2001 - 2024
|
|
A R C H I W A L N A W I A D O M O Ś Ć |
|
|
|
PHP duze tablice , Deus ex machine 16/02/09 15:44 tablice ~100k elementow. Jeden element to int(11). I pytanie czy szybciej jest operowac trzymajac element jako klucz( i wartosc = '') czy jako wartosc. Bo merge i sortowanie przy takich juz mu troche zabiera .)"Uti non Abuti" - co to za pytanie w ogole , pachura 16/02/09 16:08
1. W PHP nie ma typu int(11). Jest int.
2. W PHP wszystkie tablice sa haszowe - zawsze jest klucz i wartosc, choc czasem moze byc to nie-do-konca-jawny klucz numeryczny.
3. Nie byloby Tobie najprosciej napisac parulinijkowy skrypt ktory by to sprawdzil ? Przeciez dla roznych wersji PHP i roznych architektur serwera odpowiedz moze byc rozna...
4. Zwykle tego typu operacje (sortowania, dzialania na wiekszych zbiorach) robi sie po stronie bazy danych, a nie w skrypcie.- ... , Deus ex machine 16/02/09 16:36
ad 1 - int(11) ze to string max 11 znakowy zawierajaca liczbe calkowita
ad 2 - wiem o tym, ale zapis tablica[$klucz] = $val gdzie $val bedzie rozny int(11) lub gdzie $klucz = int(11) a $val = ''. Nieco sie roznia objetoscia
ad 3 a - chyba tak bede musial zrobic
ad 3 b - a dlaczego ma byc rozna?
ad 4 - jakbym robil to na bazie, to by sie ta baza "zajechala", te tablice to juz jest maksymalna optymalizacja operacji jakie wykonuje"Uti non Abuti" - Hmmm , pachura 16/02/09 17:06
> ad 1 - int(11) ze to string max 11 znakowy zawierajaca liczbe calkowita
Potrzeba Tobie az tyle cyfr ? Bo np. jest nie przekraczasz wartosci 2147483648, to mozesz po prostu uzyc inta, ktory zajmuje 4 bajty zamiast 12-u jak w przypadku stringa...
> ad 2 - wiem o tym, ale zapis tablica[$klucz] = $val gdzie $val bedzie rozny int(11) lub gdzie $klucz = int(11) a $val = ''. Nieco sie roznia objetoscia
Strasznie mieszasz. Moze napiszesz co ma reprezentowac ta tablica ? Co jest w niej przechowywane. I jakie operacje chcesz wykonac.
> ad 4 - jakbym robil to na bazie, to by sie ta baza "zajechala", te tablice to juz jest maksymalna optymalizacja operacji jakie wykonuje
Szczerze watpie. Nie ma sensu probowac byc madrzejszym od silnika bazy danych ktory przeciez jest do tego typu operacji specjalnie napisany...- silnik silnikiem , Deus ex machine 16/02/09 23:04
sek w tym, ze zapytania robia sie po kilka sekund. Zapytania sa optymalizowane, a dodatkowo to nie sa stale zapytania tylko generowane dynamicznie. W tych bazach indeksy na jedna tabele ida czasem w setkach mega, a ilosc rekordow w miliony tez na jedna tabele. Silnik daje z siebie co moze.
Takze kilka takich zapytan, zamuli baze tak, ze korzystanie z niej bedzie zalosne.
Norton, a Ciebie nie zrozumialem .)"Uti non Abuti" - Ech , pachura 17/02/09 00:22
> Takze kilka takich zapytan, zamuli baze tak, ze korzystanie z niej bedzie zalosne.
Natomiast przerzucanie wszystkiego na PHP może zarżnąć serwer WWW... na przykład gdy kilka aktywnych połączeń HTTP uruchomi jednocześnie kilka instancji Twojego skryptu, te wielkie tablice mogą zapchać całą pamięć dostępną dla interpretera PHP...
Takie rzeczy robi się zwykle w bazie danych. A jeśli zapytania mimo optymalizacji działają wolno, może schemat bazy powinna być lekko zmodyfikowany ? Często jakaś normalizacja lub denormalizacja może przynieść lepsze efekty niż indeks na każdej kolumnie. Można np. przeliczać jakieś statystyki raz na godzinę. Można dodawać jakieś pola pomocnicze żeby zasymulować hierarchię. Etc. etc.
- ad.4. , xmac 16/02/09 23:31
imho baza bedzie lepsza od php
gdybys to pisal w innym jezyku, gdzie do danych i wykonywanych czynnosci dobierasz odpowiednia strukture, to moze by bylo inaczej, ale na pewno nie w przypadku bazy
moze warto jakies indeksy pozakladac?dual&mobile power
XMAC - mialo byc php , xmac 16/02/09 23:33
[...]ale na pewno nie w przypadku bazy[...]
zamiast bazy mialo byc phpdual&mobile power
XMAC
- :) - tytuł posta, min. 3 znaki. , Norton 16/02/09 17:55
pkt. 4 zrobił na mnie piorunujące wrażenie. Wręcz zmiótł mnie z balkonu w psie gówno na trawniku.Zmień swój podpis na Boardzie
maks 100 znaków, 3 linie,
zabroniony spam oraz reklama
- Ten wynik jest potrzebny w calosci? , ptoki 16/02/09 19:17
Moze lepiej wybierac z bazy tylko dane ktore rzeczywiscie sa potrzebne i je sortowac?
A moze jakis temptable na to?- niestety w calosci, dziwne , Deus ex machine 16/02/09 23:05
ale tak jest szybciej .)"Uti non Abuti" - to moze sort :) , ptoki 17/02/09 14:57
wynik zapisac do pliku puscis sort -k i wynik wczytac z pliku?
Wiem ze dziwne ale wierzyc mi sie nie chce ze wrzucanie tego do bazki i sortowanie tego tam w temptable jest wolne...
Co to za bazka? mysql?
- imo , Holyboy 16/02/09 23:48
szybciej jest jako klucz, ale nie sprawdze terazStrength is irrelevant.
Resistance is futile.
We wish to improve ourselves. - może jednak pole, wg ktorego chcesz sortować, opatrz indeksem w bazie danych , bwana 17/02/09 08:37
w zależności od sytuacji unikalnym lub zwykłym. Oczywiście przy założeniu, że sortowanie, które chcesz wykonywać, jest statyczne (czyli zawsze wg tej samej metody, np. arytmetyczne lub binarne).
Tak jak napisali koledzy wyżej, w PHP tablica zawsze jest zbudowana z par klucz=>wartość, nawet jeśli tego nie widać gołym okiem.
Pomysł sortowania dużych danych w PHP (czyli po stronie serwera www) wydaje mi się dość nieortodoksyjny, no ale może ma swoje uzasadnienie. Wydaje mi się jednak, że silniki baz danych lepiej radzą sobie z takimi zadaniami. Nie chodzi mi wyłącznie o wydajność, ale o np. skuteczne kolejkowanie takich procesów oraz optymalne zużycie pamięci. Bo przecież należy wyobrazić sobie, że w danym czasie może takich sortowań być wiele. Można śmiało założyć, że żeby zwrócić posortowane dane, baza nie musi przechowywać w pamięci całej tabeli, natomiast taki kod PHP - jak widać przechowuje."you don't need your smile when I cut
your throat" - tak jak pisalem baza robi co moze , Deus ex machine 17/02/09 08:44
a takie operacje w php to juz jest budowanie cache samych indeksow danych. Jak juz sie zbuduje cache to wszystko pariadkie, jak zdaze to przetestuje w tym tygodniu wartosci jako klucze. Bo przy zwyklej tablicy miejsce zajmuje mi indeks i wartosc, a jak bede indeksowal wartoscia to moze cos uszczypne na rozmiarze .)"Uti non Abuti" - przy takich założeniach trzeba pomyśleć w takim razie o optymalizacji architektury , bwana 17/02/09 08:57
tego rozwiązania. Chodzi mi o to, że jeżeli wiele sesji używa tego samego "sposobu sortowania", to nie ma potrzeby by każda sesja takie sortowanie wykonywała, lepiej, by sortowanie odbyło się tylko tyle razy, ile faktycznie w globalnym ujęciu potrzeba.
Załóżmy, że sesje aplikacyjne chcą mieć dane posortowane w zależności od widzimisię użytkownika albo rosnąco albo malejąco. Jeśli gdzieś (poza sesją, ale dostępne dla sesji) są dane posortowane rosnąco oraz dane posortowane malejąco, to przy pewnych założeniach (np. że cache danych nie wymaga odświeżania zbyt często) taki sposób pozwoli ograniczyć zużycie pamięci. Wtedy wszystkie sesje mogłyby odwoływać się do tej samej "globalnej" tablicy z danymi. Jak to zrealizować? Szczerze mówiąc nie wiem. Może jakiś webserwis? Może pliki tekstowe zawierające posortowane dane? Może in-memory-database?
Procesowo mogłoby to wyglądać tak:
użytkownik (sesja php) chce dostać posortowane dane. Skrypt sprawdza, czy w "sortowniku" już są dane posortowane żądaną metodą (powiedzmy - rosnąco). Jeśli nie, to sortuje je i wrzuca do "sortownika". Potem skrypt robi to, co miał robić. Jeśli następny użytkownik zażąda danych posortowanych w ten sam sposób, to skrypt sprawdzi, dowie się, że dane są już gotowe w sortowniku i od razu je z niego pobierze.
Oczywiście wiele zależy od tego, jak wiele różnych metod sortowania jest dopuszczalnych, bo wiadomo - każda nowa dopuszczalna metoda sortowania oznacza kolejną kopię danych w pamięci. Jeśli jednak rozwiązanie nad którym pracujesz mieści się w opisanych przeze mnie założeniach (mało metod sortowania, rzadko następujące przyrosty danych) to spróbuj tak."you don't need your smile when I cut
your throat" - autopoprawka , bwana 17/02/09 09:10
Akurat rosnąco-malejąco można zoptymalizować, wystarczy jedna posortowana tablica z której można pobierać dane od początku do końca albo od końca do początku, aż się dziwię, że mi to od razu do głowy nie przyszło. Domyślam się jednak, że nie o takie proste sortowania Ci chodzi. Tak czy siak, jeśli występują sortowania "symetryczne", to można je właśnie w ten sposób zoptymalizować. Parzyste-nieparzyste (ogólnie - spełniające lub niespełniające kryterium binarne) też.
Należy też pomyśleć o procesie odświeżania danych w cache-u kiedy w danych źródłowych pojawią się nowe wartości a na starym cache-u nadal pracują użytkownicy. To może być kłopotliwe."you don't need your smile when I cut
your throat" - a z ciekawości zapytam: robisz coś w rodzaju BI , bwana 17/02/09 09:16
znaczy się Business Intelligence? Tabele przestawne z danymi, drążenia i tak dalej?"you don't need your smile when I cut
your throat" - a ty cos robisz z BI? , xmac 17/02/09 11:34
ze sie tak nieladnie wetne ;_)dual&mobile power
XMAC - robię , bwana 17/02/09 11:43
niewiele, ale robię, w OWB i Oracle BI"you don't need your smile when I cut
your throat" - dzieki za info... , xmac 17/02/09 13:51
ja natomiast w konkurencyjnych narzedziach - business objects ;_)dual&mobile power
XMAC
- Nie uszczkniesz , pachura 17/02/09 10:00
Tablice haszujace w PHP przechowuja liste wszystkich kluczy, zeby mozna bylo po nich iterowac. Z punktu widzenia zajetosci pamieci nie ma wiec roznicy czy zrobisz tablice int => string czy string => int.- wlasnie, , ptoki 17/02/09 15:00
A czemu Deus nie iteruje po tych tabelach? ZTCP takie haszowane tabele mozna iterowac alfabetycznie (dawno cos tam robilem).
W najgorszym wypadku mozna padowac te int-y zerami z lewej...
|
|
|
|
|
All rights reserved ® Copyright and Design 2001-2024, TwojePC.PL |
|
|
|
|