2011-02-02 14 views
5

Pracuję w systemie Android, gdzie pamięć jest ograniczona i nie ma funkcji podobnej do wymiany plików. Czytałem, że ludzie zaimplementowali funkcjonalność podobną do wymiany plików przy użyciu plików mapowanych w pamięci w swoich aplikacjach, ale nie rozumiem, jak to działałoby. Czy ktoś wie?Używanie pliku odwzorowanego w pamięci jako pliku wymiany?

Myślę, że ogólny pomysł jest taki, że jeśli mój program chciałby użyć tablicy int o rozmiarze 20 Mb, mógłbym utworzyć dane dla tej tablicy w pliku 20 Mb, a następnie użyć funkcji mapowania pliku pamięci do Przejrzysto wprowadzaj do pamięci części pliku, które obecnie muszę czytać i zapisywać. Kluczowym elementem jest to, że chociaż mam 20Mb przestrzeni do odczytu/zapisu, tylko niewielki ułamek tego jest zawsze w pamięci na raz (aplikacje na Androida są ograniczone do ~ 24Mb pamięci).

Wolę pracować w Javie, ale rozwiązanie C też by działało.

Edit: Ta pamięć odwzorowany plik Sztuką jest wymienione tutaj, ale ja nie rozumiem, jak to działa http://grammerjack.blogspot.com/2009/10/gles-quake-port-of-quake-to-android.html

+1

Czy nie zamieniasz pamięci mapowanej na pliki? – ruslik

+0

Android nie ma skonfigurowanej wymiany. Ze względu na sposób działania aplikacji system operacyjny może zabić wszystko, czego nie ma na pierwszym planie, gdy pamięć się wyczerpuje. Pliki odwzorowane w pamięci działają najlepiej w przypadku danych tylko do odczytu (strony mogą być odrzucane pojedynczo), ale można również wykonać udostępniony odczyt/zapis, aby uzyskać zachowanie podobne do zamiany. – fadden

Odpowiedz

1

W Javie używać java.nio.MappedByteBuffer.

W języku C użyj funkcji POSIX mmap(). Działa na Androida dobrze.

+1

Należy zauważyć, że aby brudne strony w odwzorowaniu pozostały z plikami, należy podać flagę 'MAP_SHARED' na' mmap() '. – caf

+0

Ponieważ Java ma funkcję o nazwie "pliki mapowane w pamięci", jestem zdezorientowany na różnicę między tym a mmap. Tak czy inaczej, w jaki sposób mogę ograniczyć ilość pliku w pamięci na raz? Muszę być sumieniem, ile pamięci jest używane, a mmap po prostu pyta o rozmiar pliku do mapowania. Co stanie się z pamięcią, jeśli przydzielę wszystkie pliki 20 MB? – rbcc

+0

Jeśli mówisz o klasie android.os.MemoryFile, to nie jest to - jest to pamięć dzielona. Jeśli spróbujesz przydzielić więcej pamięci, mapując system, mmap będzie się nie wyświetlał. To, czy chcesz zmapować cały plik, czy nie, zależy od Ciebie. mmap nie pyta o rozmiar * pliku * - prosi o rozmiar odwzorowania, dając w ten sposób opcję odwzorowania tylko części całego pliku. –

Powiązane problemy