2012-02-22 10 views
12

Estoy pensando en implementar la primera capa de almacenamiento en caché en una aplicación de Android. Estaba considerando SoftReferences para evitar las excepciones de OOM, pero dado que hay muchos artículos sobre cómo Android los libera "demasiado pronto", decidí buscar en el caché de android.util.LruCache.Tamaño LRU Caché de acuerdo con las capacidades del dispositivo y la memoria libre

Pregunta: ¿Cómo puedo clasificarlo correctamente para el dispositivo real? Todo suena muy bien que una caché LRU es la solución real y no SoftReferences, pero si realmente desea evitar las excepciones OOM, se siente extremadamente inseguro con cualquier número de megabytes de referencias difíciles. Es inseguro si me preguntas. De todos modos, esta parece ser la única opción. Estaba buscando en getMemoryClass para averiguar el tamaño de almacenamiento dinámico de la aplicación en el dispositivo real (+ comprobando el tamaño de almacenamiento dinámico libre antes de dimensionar la caché). La línea de base es de 16 Megas, lo que suena bien, pero he visto dispositivos (G1, por ejemplo, en los viejos tiempos) lanzando excepciones de OOM con solo unos 5 megabytes de tamaño de almacenamiento dinámico (de acuerdo con Eclipse MAT). Sé que un G1 es muy antiguo, pero el punto es que mis experiencias realmente no se alinean con la línea de base de 16 Megs que menciona la documentación. Por lo tanto, estoy completamente inseguro sobre cómo debo escalar un caché LRU si necesito lo más que puedo obtener razonablemente. (Sería feliz con 8 Megs e iría con tan solo 1 Meg en un dispositivo de baja especificación)

Gracias por cualquier pista.

Editar: La clase de caché LRU Android que me refiero: http://developer.android.com/reference/android/util/LruCache.html

Respuesta

14

creo que una solución válida para calcular el tamaño LRUCache se describe en la guía dev:

int memClass = ((ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass(); 
int cacheSize = 1024 * 1024 * memClass/8; 

Más información se puede encontrar aquí: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

+0

Sí, terminé usando la clase de memoria de una manera similar. Todavía me parece una gran conjetura, pero no encontré un método más exacto. – user289463

+3

Asegúrese de que sizeOf también devuelva el tamaño en bytes. En el enlace de arriba, devolvieron bitmap.getByteCount()/1024 (¡en kilobytes! Esto funciona, por supuesto, pero luego su cacheSize debería ser 1024 * memClass/8) – DominicM

0

Desde su pregunta es un poco complicado de entender lo que está pidiendo. Déjame intentarlo.

Varios productos de almacenamiento en caché AppFabric, memcached, ncache y scaleout tienen una limitación de 1M por objeto. Creo que el escalado ofrece algún tipo de personalización.

Pero todos estos son productos del lado del servidor. Por lo tanto, para un dispositivo Android, que probablemente sea solo un caché local único, probablemente tenga un máximo de 64kb. Quiero decir, ¿por qué alguien necesitaría más de 64 kb por objeto en un dispositivo? Solo mi conjetura.

Si yo fuera usted, estudiaría memcached (la solución de caché de código abierto más famosa). Y puede ser escalable, ya que es fácil conseguir un mundo de saludo trabajando también a escala. Y decida proporcionalmente.

+0

Hola Siddharth, En Android un propósito muy típico de el almacenamiento en memoria caché (memoria y almacenamiento) es el almacenamiento en caché de listas y miniaturas. Una miniatura puede ser fácilmente de 20kbytes en sí misma y mostraría 40-50 miniaturas en una Grilla. Estoy hablando de megabytes. La pregunta es más sobre encontrar el tamaño adecuado desde la perspectiva específica de Android. No se relaciona con las soluciones del lado del servidor, ya que usted conoce el hardware de su servidor, pero usted no conoce las 700 cientos de configuraciones HW diferentes en las que se ejecutará su aplicación Android. – user289463

+0

Entonces, si no me equivoco, Android no tiene un almacenamiento secundario que sea más lento que la memoria, ¿verdad? Todos son la misma memoria, primaria y secundaria. Entonces, ¿por qué alguien querría un caché LRU? Me pregunto ? – Siddharth

+0

Existe la RAM que voy a usar con el caché LRU. Este es el más rápido. Luego está el almacenamiento interno, que es el siguiente más rápido. También hay almacenamiento externo que puede ser cualquier cosa, incluso una tarjeta SD lenta. Estoy hablando de RAM aquí como mi caché L1. – user289463

Cuestiones relacionadas