Dimensionamiento de caché de LRU de acuerdo con las capacidades del dispositivo y la memoria libre

StackOverflow https://stackoverflow.com/questions/9399278

  •  29-10-2019
  •  | 
  •  

Pregunta

Estoy pensando en implementar la primera capa de mi almacenamiento en caché en una aplicación de Android. Estaba considerando que Softreferences seguramente evitará las excepciones de OOM, pero dado que hay muchos artículos sobre cómo Android libera estos "demasiado pronto", decidí buscar en android.util.lrucache caché.

Pregunta: ¿Cómo lo digo correctamente para el dispositivo real? Todo suena muy bien que un caché LRU sea la solución real y no Softreferences, pero si realmente está interesado en evitar las excepciones de OOM, se siente extremadamente inseguro ir con cualquier cantidad de megabytes de referencias difíciles. Es inseguro si me preguntas. De todos modos, esta parece ser la única opción. Estaba investigando GetMemoryClass para descubrir el tamaño del montón de la aplicación en el dispositivo real (+verificar el tamaño del montón gratuito antes de dañar el caché). La línea base es de 16 megs, lo que suena bien, pero he visto dispositivos (G1, por ejemplo, en los viejos tiempos) que arrojan excepciones de OOM a unos 5 megabytes de tamaño de montón (según 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 incierto, cómo debo ampliar un caché LRU si necesito lo máximo que pueda obtener razonablemente. (estaría contento con 8 megs e iría tan pequeño como 1 meg en un dispositivo de baja especificación)

Gracias por cualquier pista.

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

¿Fue útil?

Solución

Creo que se describe una solución válida para calcular el tamaño de Lrucache en la guía del desarrollo:

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

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

Otros consejos

De su pregunta, es un poco confuso entender lo que está haciendo. Déjame intentarlo.

Varios productos de almacenamiento en caché AppFabric, Memcached, Ncache y Scaleut tienen una limitación de 1M en el objeto. Creo que Scaleut ofrece algún tipo de personalización.

Pero todos estos son productos del lado del servidor. Entonces, para un dispositivo Android, que probablemente será solo un solo caché local host, probablemente iría con un máximo de 64 kb. Quiero decir, ¿por qué alguien necesitaría más de 64 kb por objeto en un dispositivo? Solo mi suposición.

Si yo fuera tú, estudiaría Memcached (solución de almacenamiento en caché de código abierto más famosa). Y puede ser escala ya que es fácil hacer que un mundo de saludo también trabaje con escala. Y decidir proporcionalmente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top