Android i problem z czytaniem większego pliku

0

Witam,
Emulator Galaxy Nexus Android 4.2.2 API 17, RAM 1024MB.

Jest plik wielkości ok. 12Mb umieszczony w pakiecie obok klasy.
Plik zapisany samymi liczbami float w reprezentacji binarnej muszę przeszukać pod kątem pewnych wartości.

InputStream.available() pokazuje liczbę identyczną z wielkością pliku.
Odczyt jest prawidłowy do 45 tys. rekordów:
...
lat=82.0 lon=119.0 off=4.24
lat=82.0 lon=119.25 off=4.2

aż nagle pojawiają się błędne wartości:
lat=0.0 lon=2.390615180138138E-41 off=1.9509440872388158E-20

i spełnia się warunek zakończenia odczytu a wartości są z kosmosu bo tam są tylko współrzędne geograficzne i ofset wysokości.
Nie ma żadnego wyjątku.
Kod pracuje bezbłędnie na PC z tym samym plikiem (pakietem jar).
Nie ma optymalizacji aby się "skipnąć" (tu akurat mógłbym to zrobić bo dane są posortowane) bliżej poszukiwanych wartości i nie czytać od początku całego pliku ale nie o to chodzi bo jak ma czytać to ma czytać.
Na telefon nie wrzucałem tego by nie rozwalać sobie już działającej appki, też nie istorne bo środowisko testowe ma być tak samo funkcjonalne jeżeli chodzi o takie aspekty.
Wyglada mi to albo na brak rozumu (RAM?) lub jakieś ograniczenia w emulatorze Android SDK (zwróciłem uwagę że wirtualna maszyna po pewnym czasie restartuje co czyni ją do pewnych zastosowań dysfunkcjonalną) .
Puszczałem ten kod w oddzielnym wątku poza główną "aktywnością" ale tak samo kicha.
Pozdrawiam.

Poniżej kluczowe fragmenty kodu.

...

dobule latitude = 23.00;

InputStream is = this.getClass().getResourceAsStream("/sciezka/plik.dat");
DatFileReader reader = new DatFileReader(is);
Object[] record;
double lat,lon,off;

while (is.available() > 0) {

 record = reader.read(); //  wczytanie 3 x 4 bajty do 3 obiektów Float  
 lat = (Float) record[0];
 lon = (Float) record[1];
 off = (Float) record[2];

 if(latitude > lat)
    break;
 }

}

...
return off;
}
0

Sprawdziłem na telefonie i to samo.
Andron i kolejny raz "rence" "opadajom". Kolejne potwierdzenie że Java została tu skopana.

0

Złej baletnicy przeszkadza rąbek u spódnicy :).
Z androidem jest wszystko w porządku, emulator nie ma ograniczeń i się nie zawiesza.
Sformatuj kod, opisz konkretnie problem to może będę w stanie pomóc.

0
XPert napisał(a):

Sprawdziłem na telefonie i to samo.
Andron i kolejny raz "rence" "opadajom". Kolejne potwierdzenie że Java została tu skopana.

W sumie na androidzie to jest virtualna maszyna dalvika, a nie javy, ale java się da łatwo przekompilować do tego kodu bajtowego.

0
Biały Jeleń napisał(a):
XPert napisał(a):

Sprawdziłem na telefonie i to samo.
Andron i kolejny raz "rence" "opadajom". Kolejne potwierdzenie że Java została tu skopana.

W sumie na androidzie to jest virtualna maszyna dalvika, a nie javy, ale java się da łatwo przekompilować do tego kodu bajtowego.

Jak zwał tak zwał JVM czy Dalvik wiadomo o co chodzi a ta dywagacja nie przybliża mnie do rozwiązania tematu.

0
Nadziany Kot napisał(a):

Złej baletnicy przeszkadza rąbek u spódnicy :).
Z androidem jest wszystko w porządku, emulator nie ma ograniczeń i się nie zawiesza.
Sformatuj kod, opisz konkretnie problem to może będę w stanie pomóc.

Mógłbyś sobie darować prywatne wycieczki skoro nie potrafisz mi dać odpowiedzi.
Jasne Android system pozbawiony jakichkolwiek błędów i to od samego początku.
Jakbys uważnie jeszcze nie przeczytał to przypomnę że na JVM kod chodzi
i jest to sam "spód" bo tylko java.io, pętla i rzutowanie.
Problem jest opisany na tyle konkretnie na ile potrzeba by ktoś kto się z tym problemem spotkał
będzie mógł dać mi odpowiedź.

0

Drogi kolego XPercie od Androida,
aplikacje mobilne działają na urządzeniach o ograniczonych zasobach. To nie jest PC do którego można wsadzić 32GB RAM oraz i7, a następnie świrować. W związku z tym sposoby, które sprawdzają się na PC, nie sprawdzą się na urządzeniu mobilnym. Aplikacje mają ograniczoną przez system ilość zasobów, których przekroczenie powoduje takie błędy. Gdybyś choć trochę poszukał w Internecie, to znalazłbyś już rozwiązanie, jednakże wolisz pluć na system, którego nie rozumiesz.

0
Haskell napisał(a):

Drogi kolego XPercie od Androida,
aplikacje mobilne działają na urządzeniach o ograniczonych zasobach. To nie jest PC do którego można wsadzić 32GB RAM oraz i7, a następnie świrować. W związku z tym sposoby, które sprawdzają się na PC, nie sprawdzą się na urządzeniu mobilnym. Aplikacje mają ograniczoną przez system ilość zasobów, których przekroczenie powoduje takie błędy. Gdybyś choć trochę poszukał w Internecie, to znalazłbyś już rozwiązanie, jednakże wolisz pluć na system, którego nie rozumiesz.

Gdybyś znawco, rozumicielu i wielbicielu (już nie wiem kotów czy Androna) uważnie czytał co napisałem nie powrtarzałbyś moich wniosków o ograniczeniach, no i powinien być wyjątek
do obsługi, no ale to dziurawy Android.
Szukanie "trochę" raczej nie naprowadzi na rozwiązanie. Te słowa skieruj do swojego przedmówcy który pisze że nie ma ograniczeń.
Kolejny który nie ma nic do napisania a się sadzi wyżej niż s...

Najszybszym rozwiązaniem jest położenie pliku na boku i odczyt poprzez FileInputStream wtedy kod pracuje bezproblemowo
(to info do innych jako że problem rozwiązałem).

0

Jestem miłośnikiem Jaśnie Nam Panującego Naczelnika Jarosława oraz Jego Kota Jakkolwiek Mu Na Imię. Lepiej?

Jeżeli chodzi o Androida, to nie uważam się za żadnego znawcę, wręcz przeciwnie jestem amatorem. Jednak fakt, że jak chcesz cokolwiek policzyć, ściągnąć, odczytać... whatever w Androidzie, to robisz to poza wątkiem głównym uczą nawet w Androidowym przedszkolu i nawet taki amator jak ja to wie.

0
XPert napisał(a):
Nadziany Kot napisał(a):

Złej baletnicy przeszkadza rąbek u spódnicy :).
Z androidem jest wszystko w porządku, emulator nie ma ograniczeń i się nie zawiesza.
Sformatuj kod, opisz konkretnie problem to może będę w stanie pomóc.

Mógłbyś sobie darować prywatne wycieczki skoro nie potrafisz mi dać odpowiedzi.
Jasne Android system pozbawiony jakichkolwiek błędów i to od samego początku.
Jakbys uważnie jeszcze nie przeczytał to przypomnę że na JVM kod chodzi
i jest to sam "spód" bo tylko java.io, pętla i rzutowanie.
Problem jest opisany na tyle konkretnie na ile potrzeba by ktoś kto się z tym problemem spotkał
będzie mógł dać mi odpowiedź.

Spokojnie, przyjdzie trochę wiedzy to zdążysz spokornieć :D.
Co do odczytu pliku, trzymanie danych w takim formacie nie jest dobrym pomysłem. Znacznie lepiej (i wydajniej) sprawdziłby się tutaj json.

0
Haskell napisał(a):

Jestem miłośnikiem Jaśnie Nam Panującego Naczelnika Jarosława oraz Jego Kota Jakkolwiek Mu Na Imię. Lepiej?

Jeżeli chodzi o Androida, to nie uważam się za żadnego znawcę, wręcz przeciwnie jestem amatorem. Jednak fakt, że jak chcesz cokolwiek policzyć, ściągnąć, odczytać... whatever w Androidzie, to robisz to poza wątkiem głównym uczą nawet w Androidowym przedszkolu i nawet taki amator jak ja to wie.

Przeczytaj co pisałem (zakładając wątek) że puszczałem w oddzielnym watku i nie ma to wpływu. Naucz się czytać co inni piszą a nie bij piany.

0
Nadziany Kot napisał(a):
XPert napisał(a):
Nadziany Kot napisał(a):

Złej baletnicy przeszkadza rąbek u spódnicy :).
Z androidem jest wszystko w porządku, emulator nie ma ograniczeń i się nie zawiesza.
Sformatuj kod, opisz konkretnie problem to może będę w stanie pomóc.

Mógłbyś sobie darować prywatne wycieczki skoro nie potrafisz mi dać odpowiedzi.
Jasne Android system pozbawiony jakichkolwiek błędów i to od samego początku.
Jakbys uważnie jeszcze nie przeczytał to przypomnę że na JVM kod chodzi
i jest to sam "spód" bo tylko java.io, pętla i rzutowanie.
Problem jest opisany na tyle konkretnie na ile potrzeba by ktoś kto się z tym problemem spotkał
będzie mógł dać mi odpowiedź.

Spokojnie, przyjdzie trochę wiedzy to zdążysz spokornieć :D.
Co do odczytu pliku, trzymanie danych w takim formacie nie jest dobrym pomysłem. Znacznie lepiej (i wydajniej) sprawdziłby się tutaj json.

Nie oceniaj innych po dziadowskim działaniu OS na który akurat usiedli, bo nie wiesz jaki mam wiek i lata w programowaniu gdy o Androidzie wiedzieli z książek S. Lema.

To już wolę Sqlite a wydajność JSON nie wiem (wszystkiego znać nie muszę) zaś objętość to uważasz że upchnie mi jeden rekord czyli 3 floaty w 12 bajtach albo jak w tym przypadku przejdę na half - float w sześciu? Abstrachuję od faktu że mam ponad milion rekordów i wiem jak to w "javach" wygląda wydajność w kręceniu się po dużych plikach klasami które ciągle tylko coś dziedziczą i implementują a nie jest wywoływany kod natywny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1