Šta je novo?

J2ME aplikacija puca

nexilion

Slavan
Učlanjen(a)
14.08.2007
Poruke
403
Poena
319
Pravim J2ME aplikaciju (za S60 seriju) koja treba da ucita iz fajla oko 80.000 recenica i potom da izvrsi pretragu. Napravio sam niz Stringova velicine 80000 i to prolazi kompajliranje (u svakom stringu stoji po jedna recenica). Aplikacija ucitava do negde oko 28.000 a zatim pukne (Unhandled Exception). Pretpostavljam da je problem velicina heap-a tj. ne moze sve to da smesti... E sad fajl iz koga se ucitava je oko 2.5MB, a aplikacija je oko 10KB, tako da to i nije nesto mnogo i mislim da ne bi trebao emulator da puca na toliko podataka. Kako da resim ovaj problem?
 
Poslednja izmena:
Ne bi trebalo da veličina heap-a predstavlja problem. Šta više mislim da možes svih 80000 rečenica da smestiš u jedan String :) Inače moja preporuka ti je da koristis Vector klasu za smeštanje stringova (i bilo kojih drugih objekata), a ne kreiranje klasičnih nizova (ako si klasični niz kreirao new String[80000]) tako]e još jedna preporuka kada koristiš veliki broj stringova nije loše umesto String objekata da se koriste StringBuffer objekti (brže radi u odnosu na klasičan String-sama String klasa u pozadini koristi StringBuffer objekte i mnipuliše njima)
 
Pa vidi koji se tacno exception baca. Ako je OutOfMemoryException onda nema mesta na heap-u da se sve to alocira. Ja nikada nisam radio sa J2ME, tako da nemam pojma koja su default podesavanja virtuelne masine, ali mozes da promenis heap size tako sto kao argument VM posaljes -Xmx<nekaVrednost>.

I ako se radi pretraga koristices neki hash, ili stablo umesto vektora.
 
Pa i ja sam pocetnik sto se Jave tice, a tek J2ME tu sam pravi typedef noob :).
Ovaj kod koji sam napravio je u stvari prepravka koda koji mi vec radi u Javi SE i to odlicno radi (ucitava ceo fajl za sekundu, takodje daje rezultat pretrage odmah).
Videcu ovo sa Vector, da li ce nesto promeniti. Hash tablice bih takodje mogao, ali sto se njih tice opet moram sve ubaciti u memoriju, a bas pri ubacivanju puca program. Kasnije kada uspem da ubacim fajl u memoriju, onda cu videti koliko se to brzo izvrsava i ako ima potrebe, posegnuti za optimizacijama (Hash tablice i StringBuffer umesto stringa).

E sad, ja sam toj metodi koja ucitava stavio "throws Eception" i koji posle hvatam sa argumentom tipa Exception, ali ono nista ne uhvati. Samo u S60 Emulatoru izbaci "Unhandled exception. Close application?", bez preciziranja kakva je greska u pitanju i bez ikakave napomene u NetBeans konzoli. Kako sad da vidim koja je greska, kako da je uhvatim?

Edit: Upravo sam probao i na telefonu, da bih video da nije nesto do emulatora. Ista stvar, identicna poruka.
 
Poslednja izmena:
i ja mislim da u slucaju nestanka memorije treba (mora) da emituje OutOfMemoryException... Probaj ovo sto je Sinter napisao u emulatoru, ali imaj u vidu da se to mozda razlikuje na specificnom uredjaju-posto su skoro svi razliciti po osobinama. Inace u Javi SE ti odlicno radi i zbog toga sto SE moze da iskoristi svu raspolozivu memoriju na racunaru, dok je J2ME pravljena za uredjaje sa ogranicenom kolicinom memorije, pa je mnogo ogranicenija od SE po tom pitanju (i po drugim pitanjima) i sve zavisi od same konfiguracije na odredjenom telefonu...Inace ne znam o kakvoj pretrazi se radi, pa mozes razmisliti da ucitavanje razbijes u delove (moze da se uradi i uz pomoc niti), tako da naprimer ucitas 5000 reci, pa obradis, pa ponovo ucitas i td (naravno ako je ogranicenje u samoj memoriji telefona)...
 
Pa ako ti nije neophodno da ceo fajl bude u memoriji najjednostavnije je da se koristi neko baferisano citanje i cita linija po linija pri svakoj pretrazi. Uostalom vidi vec neki primer na netu kako se to radi na J2ME. Sigurno u svakom boljem tutorial-u ima primer pravljenja recnika.
 
Hvala sinter na linku, ali ovo je Sun emulator a ja radim sa S60 Nokia emulatorom (koji je stvarno identicno ponasa kao Nokia telefon). E sad zanimljiva je stvar kod moje Nokia 6120 Classic kod koje pise da je heap size unlimited (tj. koliko slobodnog RAM-a), a ipak baca gresku.
Ima sad neka fora sa EPOCHEAPSIZE ali to izgleda radi samo sa Symbian aplikacijama, a ne i sa java.
 
Poslednja izmena:
Niz od 80000 recenica gde je za svaku recenicu rezervisano 8000 znakova (pod uslovom da nije unicode) zauzima 80000 * 8000 oko 610MB. Nema sansi da na telefonu imas toliko memorije.
 
Rekao je da fajl koji se ucitava ima 2.5MB pa, sem ako nije neka mnogo jaka kompresija, nema sanse da su recenice toliko velike.
 
Fajl je 2.5 MB, bez kompresije. Recenica ima 100tinak znakova samo, negde manje negde vise, tako da zauzece memorije ne bi trebalo da predstavlja problem. Verujem cak da bi u Sun emulatoru sve lepo radilo (posle podesavanja heapa na odgovarajucu velicinu), ali na S60 emulatoru kao i na S60 telefonu ima nekih problema koji sto je najgore ne umem da uhvatim ili da dobijem neku informativniju poruku o gresci...
 
>> Reseno parcijalnim citanjem. <<

Super, drago mi je da smo bili barem malo od pomoci ;) ... Uvek je preporucljivo da se radi parcijalno citanje (osim za male izvore podataka) i to uz pomoc niti (da ti ne bi doslo do blokiranja korisnickog interfejsa dok cita).
 
Nazad
Vrh Dno