Wielkie tablice

0

Załóżmy, że mam grę w której generuje się mapa, która może być olbrzymia(np. 1000000000000x1000000000).
Jak ją przechowywać aby nie obciążała pamięci? Podzielić na kawałki i wczytywać tylko kawałek?
Oraz jak ją zapisywać i wczytywać?
Słyszałem, że można zrobić to słownikami, ale konkretów nie znam.

Pozdrawiam

0

Tablica 1012 na 1012 czyli 1024 elementów? Nawet gdyby każdy element zajmował jeden bit to potrzebowałbyś ponad 1023 bajtów, czyli 1014 gigabajtów, czyli 1011 Terabajtów. Dziesięć miliardów terabajów, srlsly? Czemu ludzie śpią na zajęciach z matematyki dyskretnej i z teorii złożoności obliczeniowej?

0

Dobra, muszę przyznać że mnie powaliłeś :P
Chciałem, żeby była to tablica int'ów.
Może trochę mniej: 16384x16384 dla przykładu (268435456 * rozmiar int)

0

to nadal cały 1GB
po co ci coś tak wielkiego?
no logiczne żeby podzielić na mniejsze kawałki, a na dysku najlepiej jeszcze skompresować
podziel na 120 sektorów 1500x1500 i wczytuj tylko aktualnie wyświetlany (8.5 MB)
na dysku możesz to rozdzielić na 120 zipów, albo jeden zip ze 120 plikami wewnątrz jeśli nie będziesz tego modyfikował

(zip mówię dla uproszczenia, wcale to nie musi być zip)

0

268435456 * 4 = 1073741824 bajtów = 1GB to już trochę lepiej...

0

Chodzi mi jedynie o to czy trzeba taką mapę przechowywać w tablicy. Czy nie istnieje inna wydajniejsza metoda? Np. słowniki

0

Ale co ci tu słownik ma pomóc? o_O Chyba że to jest macierz rzadka. Napisz COKOLWIEK na ten temat to moze będziemy w stanie ci pomóc. Jeśli cała tablica jest wypełniona wartościami które są ci potrzebne to nie, nie da się tego przechowac bardziej kompaktowo, cudów nie ma.

0

No dobra, muszę się z tym pogodzić....
Potrzebuję dokładnie każdej danej, a tablica jest zapełniana na bieżąco w czasie działania aplikacji.

0

a jak operujesz na danych? jeśli lecisz po kolei wierszami to zapisuj też wierszami, możesz stworzyć klasę która będzie doczytywać dane do pamięci i zwalniać to co już niepotrzebne. z zewnątrz to działanie będzie niewidoczne dla reszty aplikacji i będziesz po prostu podawał współrzędne jak do zwykłej dużej tablicy; po prostu co ileś iteracji program na chwilę przytnie żeby wczytać kolejną porcję danych
a jak non stop wałkujesz te same dane od początku do końca i tak w kółko to może lepiej po prostu operować od razu na dysku twardym?

tu rozwiązanie po prostu trzeba dopasować do problemu - nie ma jednego uniwersalnego

0

Użyj MappedByteBuffer
http://download.oracle.com/javase/7/docs/api/java/nio/MappedByteBuffer.html
wraz z FileChannel
http://download.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html
Ograniczenie mapowania tylko 2GB pliku też można znieść implementując własny bardziej inteligentny bufor. Nie ma wtedy większego problemu z operowaniem na mapach nawet wielkości 50-100 GB przy pamięci RAM do 1,5 GB. Trzeba tylko pamiętać, żeby bufor nie zajmował więcej niż 1/4 dostępnej w Javie pamięci i aby przetwarzać to co jest w pamięci, a nie wciąż czekać na doczytanie czegoś nowego. Dlatego trzeba włączyć w Javie myślenie bardziej niskopoziomowe. ;)

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