Mennyi adatot lehet tölteni egy kliens oldali tömbbe?
Sziasztok!
Van valakinek tapasztalata azzal kapcsolatban, hogy ha elkezdek AJAX-szal töltögetni egy tömböt kliens oldalon, akkor az nagyjából mekkora mennyiségű adattal bírkózik meg?
Tervezek egy alkalmazást, ami bizonyos feltételek szerint adatokat válogat egy olyan adattáblából, aminek a tartalma nem változik. Arra gondoltam, hogy az alkalmazás elindítása során AJAX-szal betöltögethetném az adatokat egy tömbbe, majd keresés esetén a kliens nem kommunikál a szerverrel, kizárólag a tömbben keres.
Nagyjából soronként 50-100 karakterről van szó. Szerintetek mennyit lehet ebből tömbösítnei úgy, hogy használható is maradjon?
■ Van valakinek tapasztalata azzal kapcsolatban, hogy ha elkezdek AJAX-szal töltögetni egy tömböt kliens oldalon, akkor az nagyjából mekkora mennyiségű adattal bírkózik meg?
Tervezek egy alkalmazást, ami bizonyos feltételek szerint adatokat válogat egy olyan adattáblából, aminek a tartalma nem változik. Arra gondoltam, hogy az alkalmazás elindítása során AJAX-szal betöltögethetném az adatokat egy tömbbe, majd keresés esetén a kliens nem kommunikál a szerverrel, kizárólag a tömbben keres.
Nagyjából soronként 50-100 karakterről van szó. Szerintetek mennyit lehet ebből tömbösítnei úgy, hogy használható is maradjon?
HTML
re
üdv Csaba
Érdemes valamilyen köztes megoldásban gondolkoznom?
Nekem abból a kb. 50-100 karakteres sorból lehet akár 5000-10000 is...
Két irány
1. Használhatsz esetleg Google Gearst - hátránya hogy az usertől engedélyt kell kérni az eléréséhez
2. AIR, itt elég tág tered van, ha jól tudom van benne local storage (sqlite)
3. Silverlight, no ezt nem ismerem :)
Ha a "default" beépülőket választod:
1. Flash/AS - itt van egy limitje az adatméretnek
2. Esetleg megpróbálhatod az adatokat JSben tárolni és AS-el feldolgozni, itt ugye nehéz lesz a perzisztenciát megoldani, de az AS-hez van szép json library
Flash/AS
Ez már ez én fejemben is megfordult. Első körben a beavatkozások nélküli beépülő modulokban gondolkodom, nem utolsó szempont a platform és böngésző függetlenés reális kereteken belül.
Milyen adatmérettel kell kalulálni Flash/AS esetében?
Kifejtem az alkalmazát egy kicsit bővebben:
Gyorskeresés táblázat adott oszlopára és találati sorhoz pozícionálás kliens oldalon.
Az betöltődésekor php mysql-ből lekérdez nagyjából 3000 rekordot (a jövőben leht akár ennek a duplája is). Ebből csinál egy html táblázatot egy divben, aminek fix magassága van és scrollozható. A táblázat egy sora nagyjából 4-5 cellából áll, cellánként kb. 20 karakter, tehát soronként 80-100.
A táblázat létrehozása mellett az adatokat átalakítom egy struktúra szerint és letárolom egy rejtett textarea-ban. A struktúra úgy alakul, hogy egy egység, a táblázat sora, egy sorszámlálóval ellátva.
Mikor user a táblázat fejlécében található szövemezőbe el kezd írni (onkeyup+setTimeout), egy js funkció elkezdi keresni a rejtett szövegmezőben az egyezőséget. Ha talál, értelem szerűen tudja a táblázat sorának számát és oda scrollozza a divet (állandó sormagasság = 20px; 568. sor = 568x20px)
Jelenleg kb. 1000 - 1500 sorig tökéletes a felhasználói élmény, az felett már sok minden befolyásolja. Nekem C2D Quadom van 4GB RAM-mal, nálam még a 2000 sor is jól működik, másik gépen már erősen homokórázik a böngésző.
Szóval ezt akarom optimalizálni...
És az ok amiért kliensen kell megoldanom: Nincs ideje operátornak megvárni, míg visszaérkezik a válasz a szerverről!
Elképzelhető, hogy legyen egy oyan flash alkalmazás az oldalban, ami gondoskodik az adatok tárolásáról, és a kereső sztring bevitelére visszaad egy sorszámot vagy flase-t?
DB Tuning
Inkább a db lekérdezést hangolnám úgy, hogy mindig baromi gyors legyen. Ha befér szerveroldalon memóriába akkor a találati listát tenném egy memóriában tartott táblába a kliensoldal ebben keresne, ez elég gyors tud lenni.
Az operátori kereséseket elemezném folyamatosan, így egy idő után kiderül, melyek a leggyakoribb keresések. Ha ez megvan akkor a leggyakoribb keresések listáját letolnám kliensbe azonnal a maradékot meg az optimalizált táblába raknám a db szerveren. Ezután már csak aktualizálni kell a leggyakoribb keresések listát, hogy ne romoljon a performancia :)
Arról nem is beszélve, hogy ha több operátor kapná ugyanazt a full találati listát azonos vagy rövid időn belül akkor a db nem futtatja le még egyszer a lekérdezés elemézést, execution plan készítését, hanem a már kész "lefordított" queryt felhasználja, akár a találati listát is megleli az ilyen-olyan cache-ben. (legalábbis oracle tud ilyeneket, mysql-t nem ismerem ilyen szempontból)
Igen, elfogadható a felvetésed.
Ebben a pillanatban az operátor a keletkezett listát látva döntést hoz, hogyan folytatja a karaktersorozatot.
Ezért az első három karakter az egy illeszkedési minta és oda pozícionálja a táblázatot ahol a minta illeszkedés kezdődik. Eredetileg a szövegmezőn volt egy setTimeout és ha abbahagyta a gépelést 1 másodpercre, akkor indult egy AJAX kérés (SELECT * FROM akarhonnan WHERE akarmi LIKE 'abc%') és az eredmény táblázatban visszatért a divbe.
Ha folytatta a gépelést, ugyan ez történt viszont ekkor már a kliensen tárolt adatokból dolgozik a kereső. Fontos, hogy az első három karakterrel megegyező összes rekord listázott maradjon, mert ha backspacel a szövegmezőben, akkor visszafelé tekeri a rutin a listát.
Biztos igazad van, én is gondoltam már hasonlókra, mint legtöbbet használt rekordok menjenek kliensre és csak akkor dolgoztassa a szevert, ha nincs kliensen a keresett adat, a baj az, hogy az első három karakterre illesztett rekordok száma 1500-3000.
Duplikálod az adatokat
Igen.
Konkrétan a html tábla áll sorszámból és még öt mezőből, az anyag amiben a sorok számát kerestetem, az pedig sorszámból és a táblázat első oszlopainak adataiból, tehát jelentős részét duplikálom.
A táblázatban keresgélés alatt egy amolyan "keressünk a DOM-ban" dologra gondolsz?
DOM
Igen arra gondolok. De van egy ilyen kis jópofaság is: TrimQuery
Nagyon jó!
A hétvégén bevizsgálom, milyen adatmennyiséggel bír el!
Hálás köszönet!
s_volenszki
Warning
Html generálás / duplikálás: lehet, hogy tévedek, de el tudom képzelni, hogy az első letöltődést nagyban segítheti, ha htmlt is küldesz, majd query-re vagy időzítve stb. küldöd a jsont. Ez sokkal reszponzívabbá teszi az alkalmazást, mint ha a json letöltésre, plusz még a dom építésre is várni kell és csak utána jelenik meg a tartalom. Egyik lehetőség, amit szoktak csinálni, hogy csak fragmenteket küldesz, vagyis pl. egy táblázat scrollozásakor az éppen "látható" adatokat küldöd, a többit nem.
Mellékszál: sqlt optimizálni mindig érdemes, ez nem helyettesíti a reszponzivitást :)
Mellékszál2: majd meggyőzöm toxint, hogy írjon már valamit ebben a témában, mert ő ennek nagy mestere lett meló közben :)
Mellékszál2 +1