[pgsql] Funkcja w C =?ISO-8859-2?Q?pami=EAtaj=B1ca_stan?=
ethanak - 03-07-2006 00:02
[pgsql] Funkcja w C =?ISO-8859-2?Q?pami=EAtaj=B1ca_stan?=
Witam.
Wiem że takie rzeczy są najczęstszym źródłem błędów, ale próbuję wyobrazić sobie pewne usprawnienie jednego z moich malutkich projekcików.
Od razu mówię że jestem na etapie projektu wstępnego, do kodu mam jeszcze parę kilometrów :)
Mam sobie aplikację (Linux), która wykonuje zapytanie w stylu:
select word, cnt from wrdstat where (kilka ograniczeń) order by cnt desc;
Zapytanie zwraca średnio kilkanaście tysięcy słów, z których aplikacja wybiera jedno (które jej się najbardziej podoba).
Naturalnym by było stworzenie jakiejś funkcji w C i wykonanie czegośw stylu:
select word, cnt,funkcja(word,p1,p2) as a from wrdstat where (te same ograniczenia) and a < ileśtam oder by cnt desc;
(albo czegoś podobnego, w każdym razie chodzi o znalezienie listy słów dla których wartość zwracana przez funkcję będzie się zawierać w określonym przedziale).
Wiadomo że ta funkcja (analogiczna do funkcji z aplikacji) będzie również wykonana ileśtam tysięcy razy, natomiast oszczędzę (mam nadzieję) nieco czasu zmarnowanego na przesłanie wyniku z serwwera Postgresa do serwera aplikacji, a także nieco pamięci na serwerze aplikacji, jako że tych wyników będzie kilkadziesiąt (z obserwacji na doświadczalnej bazie danych warunek maksymalnej odległości edycyjnej spełnia jedno na kilkaset słów).
Jaki jest problem?
Otóż funkcja musi:
a) na podstawie trzeciego parametru wczytać sobie (z pliku lub jakiejś tabeli, to akurat nieistotne) zasady transformacji tekstu. Wczytanie nie jest specjalnie szybkie, a trzeci parametr nie ma prawa zmienić się w czasie jednej sesji (tzn. w każdym następnym wywołaniu funkcji powinien zostać zignorowany lub - w zależności od moich przyszłych upodobań - zmiana tego parametru powinna spowodować błąd).
b) według tych zasad przekształcić pierwszy i drugi parametr. O ile przekształcenie pierwszego parametru musi być wykonane za każdym razem, o tyle przekształcenie drugiego powinno być wykonane tylko wtedy, gdy parametr został zmieniony (tzn. gdy wywołuję zapytanie dla następnej wartości p1).
c) zwrócić średnią odległości edycyjnej przekształconych i nieprzekształconych parametrów word,p1
I teraz pytanie zasadnicze (bo w żadnym manualu tego nie znalazłem, ana razie jak wspomniałem jestem na etapie teorii):
Czy mogę w jakiś bezpieczny sposób zachować w funkcji informacjęo poprzednim wywołaniu, czy mam to sobie darować i jednak zwalić wszystko na aplikację?
ethanak PS. Że też człowiek nie ma co robić w niedzielę rano... -- mailto=window.atob('ZXRoYW5ha0Bwb2xpcC5jb20=');
Bartek Siebab - 03-07-2006 00:03
> ethanak w dniu 2006-07-02 11:13 pisze: -<>- > I teraz pytanie zasadnicze (bo w żadnym manualu tego nie znalazłem, a na > razie jak wspomniałem jestem na etapie teorii): > > Czy mogę w jakiś bezpieczny sposób zachować w funkcji informację o > poprzednim wywołaniu, czy mam to sobie darować i jednak zwalić wszystko > na aplikację?
przecież możesz założyć sobie tabelę parametry i w niej ta funkcja może select'nąć/update'nąć sobie rekord zawierający parametry wywołania
-- ..---------- -------- ------ ---- ---- --- - -- - | Bartek `saphire` Siebab http://bartek.siebab.net
ethanak - 03-07-2006 00:03
On 2006-07-02 15:32, Bartek Siebab wrote: >> ethanak w dniu 2006-07-02 11:13 pisze: > -<>- >> I teraz pytanie zasadnicze (bo w żadnym manualu tego nie znalazłem, a na >> razie jak wspomniałem jestem na etapie teorii): >> >> Czy mogę w jakiś bezpieczny sposób zachować w funkcji informację o >> poprzednim wywołaniu, czy mam to sobie darować i jednak zwalić wszystko >> na aplikację? > > przecież możesz założyć sobie tabelę parametry i w niej ta funkcja może > select'nąć/update'nąć sobie rekord zawierający parametry wywołania > No wiem że mogę - chodzi mi o zupełnie co innego (ja nie chcę czytać z jakiejkolwiek tabeli fafnaście tysięcy razy za jednym requestem!).
Poza tym mogą być różne sesje, w każdej sesji inny parametr. Gdyby nie to - po prostu wkompilowałbym zasady transformacji tekstu w funkcję.
Przy okazji - zauważ słowo: tysięcy.
Szczerze mówiąc chodzi mi o informację od kogoś kto to stosował- czy zastosowanie w tej sytuacji zmiennych statycznych jest bezpieczne.
ethanak -- mailto=window.atob('ZXRoYW5ha0Bwb2xpcC5jb20=');
Adam Buraczewski - 03-07-2006 00:03
ethanak <sweethanak@buziaczek.pl> wrote: > Szczerze mówiąc chodzi mi o informację od kogoś kto to stosował - czy > zastosowanie w tej sytuacji zmiennych statycznych jest bezpieczne.
Raczej tak, dopóki nie stosujesz connection pooling. Postgres odpala osobny proces dla każdego połączenia i go kończy (zwalniając pamięć) jak sesja bazodanowa się kończy. Ewentualnie, bardziej elegancko, byłoby skorzystać z Memory Contexts -- pamięć zaalokowana w ramach odpowieedniego kontekstu może być zwalniana np. po zakończeniu bieżącej transakcji. Zobacz np. contrib/dblink, tam jest tak że pierwsze wywołanie funkcji zapamiętuje coś w pamięci, a potem kolejne wykorzytstują to.
Pozdrawiam!
-- Adam Buraczewski <adamb (at) nor (dot) pl> * Linux user #165585 GCS/TW d- s-:+>+:- a C+++(++++) UL++++$ P++ L++++ E++ W+ N++ o? K w-- O M- V- PS+ !PE Y PGP+ t+ 5 X+ R tv- b+ DI D G++ e+++>++++ h r+>++ y?
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Wydajność baz danych w zależności od poziomu izolacji ANSI/ISO
Czy zna (obsługuje) ktoś program Iso Draw ?
MYSQL - kodowanie w ISO-PL
strona plus baza w iso do utf-8
Kodowanie: z iso na utf
Konwesja znaków w dump'ie bazy danych - ISO -> utf-8 -> ISO -> utf-8
=?iso-8859-2?q?Co_oznacza_b=B3=B1d_Warning:_mysql=5Fconnect() _[function.mysql-connect]:_Can't_connect_to_local_MySQL_server_through_sock et_'/var/run/mysqld/mysqld.sock'_(2)_in?=
=?iso-8859-2?q?Informatyka,_Java,_EJB,_Ajax,_Spring=2E_Czy=BF by_to_koniec_=B6wiata,_czy_te=BF_nasze_uczelnie_b= EAd=B1_uczy=B3y_w_ko=F1cu!_czego_praktycznego_=2E= 2E=2E=2E?=
=?iso-8859-2?q?Ati_Mobility_Radeon_X300_W_Notebooku_Jak_Zwi=E Akszy=E6_Ilo=B6=E6_Grafiki_Poprzez_Wsp=F3=B3dziele nie_Z_Ramu=3F=3F=3F?=
=?ISO-8859-2?Q?=AFegnam_si=EA=2E=2E=2E?=
zanotowane.pldoc.pisz.plpdf.pisz.plautwywalczyl.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|