budowa cachu - jakies rady?

Oglądasz archiwalną wersję wątku "budowa cachu - jakies rady?" z forum pl.comp.lang.java



RatDev - 29 Cze 2003, 08:12
Witam!

Moja aplikacja dosc mocno korzysta z bazy danych. Wiekszosc
zapytan ze wzgledu na swoja zlozonosc trwa dosc dlugo, dodatkowo
czesto takie same zapytania sie powtarzaja. Zrobilem sobie wiec prosty
cache.

W momencie gdy wykonam nowe zapytanie wrzucam je do
HashMap, gdzie kluczem jest zapytanie (String), a wartoscia wynik tego
zapytania rowniez jako String.

To fajnie dziala, po pewnym czasie w cachu jest duzo pozycji i aplikacja

prawie wogole nie korzysta z bazy. Pojawia sie tylko jedna watpliwosc.
Co w sytuacji gdy cache za bardzo sie rozrosnie?

Ktos ma moze pomysl jak przebudowac ten cache by nie bylo
ryzyka zuzycia calej pamieci, a z drugiej strony by dzialal efektywnie?
Najlepiej gdyby jakos sam sie oczyszczal z zadko pobieranych danych
czy cos w tym stylu.

Dzieki,
rd




Rafal 'Raf256' Maj - 29 Cze 2003, 08:12

Ktos ma moze pomysl jak przebudowac ten cache by nie bylo
ryzyka zuzycia calej pamieci, a z drugiej strony by dzialal efektywnie?
Najlepiej gdyby jakos sam sie oczyszczal z zadko pobieranych danych
czy cos w tym stylu.



Mapuj stringi na obiekty np cOdpowiedz - gdzie oprocz samej odpowiedzi
zapametasz tez czas jej udzielenia, jezeli np. baza bedzie wieksza inz
powiedzmy 50 mb, to wyrzucaj najstarsze odpowiedzi i juz.

Oczywiscie przy kazdej "trafionej" odpowiedzi - ustawiaj ponownie zapisany
w niej czas tzn, "odmladzaj" ja.



mm - 29 Cze 2003, 08:12




Witam!

Moja aplikacja dosc mocno korzysta z bazy danych. Wiekszosc
zapytan ze wzgledu na swoja zlozonosc trwa dosc dlugo, dodatkowo
czesto takie same zapytania sie powtarzaja. Zrobilem sobie wiec prosty
cache.

W momencie gdy wykonam nowe zapytanie wrzucam je do
HashMap, gdzie kluczem jest zapytanie (String), a wartoscia wynik tego
zapytania rowniez jako String.

To fajnie dziala, po pewnym czasie w cachu jest duzo pozycji i aplikacja

prawie wogole nie korzysta z bazy. Pojawia sie tylko jedna watpliwosc.
Co w sytuacji gdy cache za bardzo sie rozrosnie?

Ktos ma moze pomysl jak przebudowac ten cache by nie bylo
ryzyka zuzycia calej pamieci, a z drugiej strony by dzialal efektywnie?
Najlepiej gdyby jakos sam sie oczyszczal z zadko pobieranych danych
czy cos w tym stylu.

Dzieki,
rd



http://www.onjava.com/pub/a/onjava/2002/03/06/topten.html

Zobacz LRUCache

mm



RatDev - 29 Cze 2003, 08:28
Witam!

Mapuj stringi na obiekty np cOdpowiedz - gdzie oprocz samej odpowiedzi
zapametasz tez czas jej udzielenia, jezeli np. baza bedzie wieksza inz
powiedzmy 50 mb, to wyrzucaj najstarsze odpowiedzi i juz.



ok, tez o tym myslalem. Ale tu powstaje problem, ze co pewien czas
bede musial przejsc po tych wszystkich obiektach i sprawdzic te
wszystkie wartosci.

Boje sie, ze w momencie gdy w cachu bedzie kilka tysiecy obiektow
to sprawdzenie tego bedzie wolne. Chyba, ze sie myle i robi sie to
inaczej?

rd




Lukjel - 29 Cze 2003, 08:43

Witam!

| Mapuj stringi na obiekty np cOdpowiedz - gdzie oprocz samej odpowiedzi
| zapametasz tez czas jej udzielenia, jezeli np. baza bedzie wieksza inz
| powiedzmy 50 mb, to wyrzucaj najstarsze odpowiedzi i juz.

ok, tez o tym myslalem. Ale tu powstaje problem, ze co pewien czas
bede musial przejsc po tych wszystkich obiektach i sprawdzic te
wszystkie wartosci.



Zastosuj jakas kolekcje sortowana. To powinno rozwiazac problem.
KAsujesz 'najstarsze'.
Ja bym jeszcze zastosowal inna strategie usuwania - notowalbym 'CZAS
POTRZEBNY NA UZYSKANIE ODPOWIEDZI' i usuwal te, ktore wykonaly sie
najszybciej.
No bo co z tego ze jedno pytanie bylo zadane pol godziny temu jezeli na
jego wykonanie porzeba bylo 5 minut. Wtedy lepiej wywalic cos co bylo
zadane moze i minute temu, ale wymagalo zaledwie 5 sekund...
Mozna oczywiscie to jeszcze troche skomplikowac i pamietac (tylko
pytanie) nawet po skasowaniu i notowac JAK CZESTO BYLO UZYWANE - jezeli
jakies pytanie jest zadawane BARDZO CZESTO to w takim wypadku powinno
byc zcachowane nawet jezeli wykonuje sie stosunkowo szybko. To "szybko",
"czesto" to bardzo wazne parametry. Mysle, ze moga byc one nawet
pamietane DLUGOTERMINOWO tzn. wiele setek zapytan powinno byc
zarestrowanych (moze i dziesiatki tysiecy). Dopiero po takim okresie
mozna mowic o wprowadzaniu rzeczywistej optymalizacji.
Wystarczy popatrzec na cacha oracla - to jest engin w enginie. Jego
optymalizacja jest calkiem - calkiem i pozwole sobie zauwazyc, ze moze
lepiej zainwestowac w optymalizacje serwera bazy danych niz w
programowego cacha... U nas w firmie dzieki drobnej (pare switchow)
optymalizacji uzyskalismy przyspieszenie o rzad wielkosci (chyba gdzies
kolo 12 razy). Oczywiscie - po awarii, gdy zrobimy restore i tablice
cache sa puste - to system dziala, jak dzialal, ale po paru chwilach -
hula na calego.
Teraz pracuje nad tym jakis 'macher-cudotworca' i juz dodal do
optymalizacji pare procent (no chyba nawet i w paru przypadkach nawet
40). Ale uzywa jakis czarodziejskich switchow i wogle rzeczy ktorych
chyba nie ma w dokumentacji!
Okazalo sie, ze zapytania, ktore trwaly po minute teraz trwaja 3
sekundy (nasza optymalizacja dala 5 sekund. Zaznaczam - nie
inwetsowalismy w nowy serwer - zmiana czysto konfiguracyjna.

Lukjel



RatDev - 29 Cze 2003, 08:59
Witam!

Ja bym jeszcze zastosowal inna strategie usuwania - notowalbym 'CZAS
POTRZEBNY NA UZYSKANIE ODPOWIEDZI' i usuwal te, ktore wykonaly sie
najszybciej.
No bo co z tego ze jedno pytanie bylo zadane pol godziny temu jezeli na
jego wykonanie porzeba bylo 5 minut. Wtedy lepiej wywalic cos co bylo
zadane moze i minute temu, ale wymagalo zaledwie 5 sekund...
Mozna oczywiscie to jeszcze troche skomplikowac i pamietac (tylko
pytanie) nawet po skasowaniu i notowac JAK CZESTO BYLO UZYWANE - jezeli



na razie testuje LRUCache bo moze wystarczy, ale Twoje rozwiazania
sa bardzo ciekawe i tez je przetestuje. Pozostaje mi jedno pytanie.
Jak ustalic i zarzadzac sama wielkoscia cacha. Czy pobierac wielkosc
dostepnej
pamieci i dzielic przez srednia wielkosc obiektu i tworzyc takiej wielkosci
cache czy da sie to jakos sensowneije zrobic / zautomatyzowac?

Dodam, ze nie znam dostepnej wielkosci pamieci na serwerze, oraz nie wiem
jakie inne programy beda na nim uruchomione.

Jeszcze raz wszystkim dzieki za rady!
rd




--
Serwis Usenet w portalu Gazeta.pl -http://www.gazeta.pl/usenet/



Lukjel - 29 Cze 2003, 13:50

Jak ustalic i zarzadzac sama wielkoscia cacha. Czy pobierac wielkosc
dostepnej pamieci i dzielic przez srednia wielkosc obiektu i tworzyc takiej wielkosci
cache czy da sie to jakos sensowneije zrobic / zautomatyzowac?



Mozna to zrobic np. tak:
kazda pozycja ma oprocz podanych wczesniej parametrow (zapytanie,
odpowiedz, kiedy_ostatnio_uzyta, ile_czasu_tworzona, ile_razy_uzyta)
dodac jeszcze ile_zajmuje_miejsca
Program co jakis czas sprawdza, ile jest wolnej pamieci i ile on sam
zajmuje. Jezeli zostana przekroczone progi (np. mniej niz 50MB wolne,
lub cos w tym stylu) to nastepuje proba oczyszczania cache.
W tym celu nalezy w jakis 'sprytny' sposob wyliczyc 'WAGE' kazdego
elementu w cachu (moze to byc wyliczane statycznie - przy uzyciu
elementu, ale wtedy trzeba sprytnie powiazac wage z czasem...).
Nastepnie elementy z najwyzsza wartoscia sa usuwane, az do momentu
uzskania odpowiedniej ilosci wolnej pamieci.
Oczywiscie - wszystkie progi i parametry sa ustawianlne recznie -
podczas dzialania programu.
Do tego (to juz zaczyna byc ciekawy problem) mozna dodac modul uczacy
sie - tzn. rozpoznajacy co i kiedy jest uzywane - moze np. okaze sie, ze
sa pory dnia, kiedy jakies pytanie sie pojawia bardzo czesto, a pozniej
nie - az do nastepnego dnia np. pytanie pojawia sie tylko na poczatku
dnia (intensywnie), a pozniej spokoj. W takim wypadku mozna sobie
wyobrazic system, ktory na zasadzie predykcji SAM zadaje pytania 'w
wolnej chwili' i przygotowuje sobie cache. W latwiejszym rozwiazaniu -
waga jest wyliczana dynamicznie z uwzglednieniem wartosci wyliczanej

kierunki rozwoju. Zastosowanie modulu opartego o np. sieci neuronowe
wydaje sie miec szerokie mozliwosci - trzeba sie tylko zastanowic nad
tym CO ma ta siec rozwiazac...
Problem cache jest dosyc szeroko dyskutowany w necie i wcale nie jest to
takie proste jak sie wydaje na poczatku. Typowe techniki wcale nie daja
duzego 'kopa'. Dopiero zaawansowane rozwiazania daja naprawde duzo. Nie
znam tego czegos co testujesz - moze to jest bardzo dobry wybor.
I jeszcze - jakbys mial problem z sortowanymi listami to polecam
Collections od apacha. (www.apache.org).

I jeszcze - moze jednak zastanow sie nad pewnymi strukturami w bazie -
jezeli te pytania sa tak zlozone to lepiej zdenormalizowac strukture
tabel i wprowadzic redundancje niz kombinowac z cache?

Pozdrowienia
Lukjel



Grzegorz Mucha - 30 Cze 2003, 02:44

Ktos ma moze pomysl jak przebudowac ten cache by nie bylo
ryzyka zuzycia calej pamieci, a z drugiej strony by dzialal efektywnie?
Najlepiej gdyby jakos sam sie oczyszczal z zadko pobieranych danych
czy cos w tym stylu.



A nie możesz skorzystać z jakiegoś gotowego kesza? Na przykład JCS
(jakarta.apache.org/turbine/jcs bodaj), są i inne (całkiem przybajerowane
zresztą, z keszem rozproszonym itp.)

mucher



incasmin - 30 Cze 2003, 07:07
Poczytaj:
http://www.javaworld.com/javaworld/jw-07-2001/jw-0720-cache.html

Mozna takze poczytac o slabych referencjach -  mozna
ich uzyc w ten sposób ze JVM trzyma obiekty przez nie wskazywane wtedy
gdy jest jeszcze wolna pamiec, gdy okazuje sie ze pamiec jest potrzebna na
cos innego to obiekt wskazywany przez slaba referencje jest niszczony i jego
pamiec jest zwalniana. Pare rodzajów tych slabych referencji istnieje.

Michal



Filip Sielimowicz - 1 Lip 2003, 06:32

To fajnie dziala, po pewnym czasie w cachu jest duzo pozycji i aplikacja

prawie wogole nie korzysta z bazy. Pojawia sie tylko jedna watpliwosc.
Co w sytuacji gdy cache za bardzo sie rozrosnie?

Ktos ma moze pomysl jak przebudowac ten cache by nie bylo
ryzyka zuzycia calej pamieci, a z drugiej strony by dzialal efektywnie?
Najlepiej gdyby jakos sam sie oczyszczal z zadko pobieranych danych
czy cos w tym stylu.



To sie nazywa LRU Cache - poszukaj na pl.comp.lang.java, byl juz watek.
LRU to skrót od Last Recently Used.

Zobacz:
http://java.sun.com/j2se/1.4.1/docs/api/java/util/LinkedHashMap.html

i jak to uzyc do budowy LRU Cache (trywialne):
http://www.onjava.com/pub/a/onjava/2002/03/06/topten.html

Filip Sielimowicz
http://www.geny.z.pl


Analiza zależności między klasami/funkcjami - czy są jakieś fajne narzędzia ?
Regex, budowa prawidłowego Pattern, ktoś pomoże? (moze troche OT)
Java i blokada www - jakies API
czy ktos zna narzedzie wspomagajace budowanie specyfikacji wymagan?
  • pielegniarki opieka kielce
  • czemu po moim routerze jest getaway a potem
  • kretynskie smsy od roznych reklamodawcow
  • smieszne teksty historie
  • drzewka do kupienia
  • katowice awf fizjoterapia egzaminy
  • java;warcaby
  • tunezyjski aar 1066 1820
  • o symbianie na powaC2 nie czyli
  • Zbieranina wiadomości z for dyskusyjnych || Indeks