przechowywanie danych

0

Witam...

kiedyś pisałem już takiego posta odnośnie przechowywania dużej ilości danych które były używane do rysowania wykresu...

I dostałem odpowiedź że przecież nie muszę wczytywać wszystkiego...
I tak właśnie zrobiłem...

I niestety doszedłem do takiego etapu że jednak będę musiał wczytać wszystkie dane. :/

I pytanie do was....

Czy jest jakiś trick metoda - cokolwiek - żeby można było zaoszczędzić pamięć...

rzucę mniej więcej liczbami żeby przybliżyć problem (a jest spory :) )
jeden sygnał ma mniej więcej 9 milionów próbek. W pliku średnio jest 20 sygnałów.
Java heap space wywala przy próbie wczytania już 20 -kilku milionów próbek.
Więc mam problem trochę sporawy :)
Wiem że można wczytać taką pokaźną liczbę danych ponieważ bawiłem się programem który wczytuje taki plik i opeuje sygnałami bez żadnego problemu.
Przypomnę zapis danych mam do ArrayList dane zapisuje(do ArrayList :) ) w postaci Short-ów...

0

więc użyj bazy danych, zamiast ładować wszystko do pamięci

0

Poczytaj dokumentację (albo wpisz w konsoli polecenie java -X) i się dowiesz jak zwiększyć rozmiar sterty.

0

zwiększanie pamięci nie wchodzi w rachubę...
a co do bazy...nigdy nie łączyłem javy i bazy danych...(to się chyba nazywa JDBC :) )

niedawno kupiłem sobie książke do oracla. Czy taka baza by się nadała?(dopiero zacząłem czytać)

Zdaje mi się że oracle nie jest darmowy...

0

Problem polega na tym, ze masz nieefektywny algorytm.
W ArrayList nie przechowujesz typu short tylko Short. Ten pierwszy jest typem prymitywnym, ten drugi obiektem.
W momencie czytania pliku, tworzysz w pamieci dziesiatki milionow obiektow. Powoduje to uzycie calej wolnej pamieci dla Java.

Masz kilka wyjsc:

  1. Dane trzymasz w pliku jako ciag wartosci typu short. Dzieki temu podczas ladowania ich z pliku nie tworzysz milionow obiektow.
    Oczywiscie w tym przypadku dane musisz zapisywac do tablicy short a nie do kolekcji.
  2. Korzystasz z wzorca jakim jest "Pyłek" (ang. Flyweight). Zakres typu short obejmuje 65 535 mozliwosci. Tak wiec zamiast wielomilionowego zbioru obiektow, tworzysz wielomilionowy zbior referencji do tych obiektow. Sposob dobry, jesli nie zmieniasz wartosci tych danych.
  3. Obojetnie czy masz short czy Short, nie wczytujesz calosci pliku do pamieci. Robisz to krokowo np wczytujac 1000 wartosci, przetwarzasz, wczytujesz kolejnych 1000 wartosci. W ten sposob, w kazdym momencie w pamieci istnieje minimum 1000 obiektow Short a nie kilka milionow jak w twoim przypadku. Sposob dobry, jesli nie musisz przetwarzac calosci danych od razu.

Ktory sposob najlepszy? Zdecydowanie nr 1 polaczony z 3. Czyli operacje na typach prymitywnych z krokowym przetwarzaniem pliku.

Uzycie bazy danych nic tutaj nie pomoze. Tutaj chodzi o sposob wykorzystania tych danych. Jesli mialoby to byc robione w taki sam sposob jak z plikiem, to efekt bylby identyczny.

0

Ogólnie dane z pliku początkowo odczytuje bajtami. Ale musze je zapisywać do short'a ponieważ ten typ idealnie pasuje mi pod wyciągnięcie interesujących mnie informacji.

Czyli zmienić kolekcję na tablicę i odczytywać kawałkami...

Będzie ciężko ponieważ próbki jednego sygnału nie są jednolite(nie leżą w jednym ciągu).

Ale spróbuje tego sposobu...

Może coś wyjdzie :) dzięki :)

0

Ogólnie dane z pliku początkowo odczytuje bajtami. Ale musze je zapisywać do short'a ponieważ ten typ idealnie pasuje mi pod wyciągnięcie interesujących mnie informacji.

Czyli zmienić kolekcję na tablicę i odczytywać kawałkami...

Będzie ciężko ponieważ próbki jednego sygnału nie są jednolite(nie leżą w jednym ciągu).

Ale spróbuje tego sposobu...

Może coś wyjdzie :) dzięki :)

0

Mozesz sprobowac w calosci. Ale nie Short tylko short. Czyli wykorzystujac tablice np short[] shortArray = new short[1000000]; i ladujesz do tej tablicy.
Typ prymitywny zajmuje duzo mniej pamieci niz obiekt.

0

Panie folly...

Prawdopodobnie trafił pan jak to mówią "w sedno tarczy" :d

Używając tablic odtworzenie całego pliku zajmuje w javie ok 1 sekundy natomiast używając kolekcji wyskakuje magiczne Java heap space :)

Gratki za rady :)

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