2011-02-02 13 views
5

Estoy trabajando en Android, donde la memoria es limitada y no hay una característica de archivo de intercambio. He leído que las personas han implementado la funcionalidad de archivo de intercambio utilizando archivos asignados de memoria en sus aplicaciones, pero no entiendo cómo funcionaría. ¿Alguien sabe?¿Usa un archivo mapeado de memoria como un archivo de intercambio?

Creo que la idea general es que, si mi programa quisiera usar una matriz int que tuviera el tamaño de, digamos 20Mb, podría crear los datos para esta matriz en un archivo de 20Mb y luego usar la función de archivo mapeado de memoria traiga de forma transparente a la memoria las partes del archivo en las que necesito leer y escribir actualmente. El elemento crucial es que, aunque tengo 20Mb de espacio para leer/escribir, solo una pequeña fracción de esto está alguna vez en la memoria a la vez (las aplicaciones de Android están limitadas a ~ 24Mb de memoria).

Preferiría trabajar en Java para esto, pero una solución C también funcionaría.

Editar: Esta memoria asignada truco archivo se ha mencionado aquí, pero no entiendo cómo funcionaría http://grammerjack.blogspot.com/2009/10/gles-quake-port-of-quake-to-android.html

+1

¿El intercambio no es una memoria asignada en el archivo? – ruslik

+0

Android no tiene un intercambio configurado. Debido a la forma en que funcionan las aplicaciones, el sistema operativo puede matar todo lo que no esté en primer plano cuando la memoria baja. Los archivos mapeados en memoria funcionan mejor para datos de solo lectura (las páginas se pueden descartar individualmente), aunque también se puede hacer lectura/escritura compartida para obtener un comportamiento similar al intercambio. – fadden

Respuesta

1

En Java, utilice java.nio.MappedByteBuffer.

En C, use la función POSIX mmap(). Funciona bien con Android.

+1

Tenga en cuenta que para que las páginas sucias en la asignación permanezcan respaldadas por archivos, debe suministrar la bandera 'MAP_SHARED' a' mmap() '. – caf

+0

Como Java tiene una característica llamada "archivos mapeados en la memoria", estoy confundido por la diferencia entre esto y mmap. De cualquier manera, ¿cómo restrinjo la cantidad de archivos que hay en la memoria a la vez? Necesito ser consciente de cuánta memoria se está utilizando y mmap parece pedir el tamaño del archivo para mapear. ¿Qué pasaría con la memoria si asignara todo el archivo de 20Mb? – rbcc

+0

Si estás hablando de clase android.os.MemoryFile, entonces no lo es, es memoria compartida. Si intenta asignar más memoria mapeando el sistema, mmap se equivocará. Ya sea para mapear el archivo completo o no depende de usted. mmap no solicita el tamaño de * file *; solicita el tamaño de la asignación, lo que le da la opción de mapear solo una parte de todo el archivo. –

Cuestiones relacionadas