2012-02-22 9 views
12

Sto pensando di implementare il primo livello del mio caching in un'app Android. Stavo pensando a SoftReferences per evitare sicuramente le eccezioni OOM, ma poiché ci sono molti articoli su come Android li libera "troppo presto", ho deciso di esaminare la cache di android.util.LruCache.Dimensionamento della cache LRU in base alle funzionalità del dispositivo e alla memoria disponibile

Domanda: Come si dimensiona correttamente per il dispositivo effettivo? Sembra tutto molto bello che una cache LRU sia la vera soluzione e non le SoftReferences, ma se si vuole davvero evitare OOM Exceptions, è estremamente pericoloso andare con qualsiasi numero di megabyte di hard reference. Non è sicuro se me lo chiedi. Ad ogni modo, questa sembra essere l'unica opzione. Stavo cercando getMemoryClass per scoprire la dimensione dell'heap dell'app sul dispositivo reale (+ controllare la dimensione dell'heap libero prima di ridimensionare la cache). La linea base è di 16 Megs che suona bene, ma ho visto dispositivi (G1 ad esempio nei vecchi tempi) che lanciavano eccezioni OOM di circa 5 Megabyte di heap (secondo Eclipse MAT). So che un G1 è molto vecchio, ma il punto è che le mie esperienze non sono realmente allineate con la linea di base di 16 Megs menzionata dalla documentazione. Quindi sono completamente incerto su come dovrei scalare una cache di LRU se ho bisogno di più che posso ragionevolmente ottenere. (Sarebbe felice con 8 Megs e andrebbe con un minimo di 1 Meg su un dispositivo di bassa definizione)

Grazie per eventuali suggerimenti.

Edit: La classe di cache LRU Android mi riferisco a: http://developer.android.com/reference/android/util/LruCache.html

risposta

14

penso che una soluzione valida per calcolare le dimensioni LRUCache è delineato nella guida dev:

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

Maggiori informazioni possono essere trovate qui: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

+0

Sì, ho finito per usare la classe di memoria in un modo simile. Trovo ancora troppo approssimativo, ma non ho trovato un metodo più preciso. – user289463

+3

Assicurati che sizeOf restituisca anche la dimensione in byte. Nel link precedente hanno restituito bitmap.getByteCount()/1024 (in kilo byte! Questo funziona ovviamente, ma il tuo cacheSize dovrebbe essere 1024 * memClass/8) – DominicM

0

Dalla tua domanda la sua un po 'di confusione per capire quello che stai chiedendo. Lasciami fare un tentativo.

Vari prodotti di memorizzazione nella cache AppFabric, memcached, ncache e scaleout hanno una limitazione di 1M per oggetto. Penso che il dimensionout offra qualche tipo di personalizzazione.

Ma tutti questi sono prodotti lato server. Quindi, per un dispositivo Android, che probabilmente sarà una sola cache locale host, probabilmente andrei con un massimo di 64kb. Voglio dire, perché qualcuno dovrebbe aver bisogno di più di 64kb per oggetto su un dispositivo. Solo la mia ipotesi.

Se fossi in te, vorrei studiare memcached (la più famosa soluzione di caching open source). E potrebbe essere scalabile dal momento che è facile far funzionare un mondo ciao anche con le scale. E proporzionalmente decidere.

+0

Hi Siddharth, Su Android uno scopo molto tipico di memorizzazione nella cache (memoria e archiviazione) sono elenchi di cache e miniature. Una miniatura può essere facilmente 20kbyte in se stessa e si visualizzano 40-50 miniature in una griglia. Sto parlando di megabyte. La domanda è più sulla ricerca della giusta dimensione dalla prospettiva specifica di Android. Non si riferisce alle soluzioni lato server, dal momento che conosci l'hardware del tuo server, ma non conosci tutte le 700 diverse configurazioni HW su cui verrà eseguita la tua app Android. – user289463

+0

Quindi, se non sbaglio, Android non ha una memoria secondaria che è più lenta della memoria, giusto? Sono tutti la stessa memoria, primaria e secondaria. Quindi, perché qualcuno dovrebbe volere una cache LRU? Mi chiedo ? – Siddharth

+0

C'è la RAM che userò con la cache LRU. Questo è il più veloce Poi c'è l'Internal Storage che è il prossimo più veloce. C'è anche una memoria esterna che può essere qualsiasi cosa, anche una scheda SD lenta. Sto parlando di RAM qui come la mia cache L1. – user289463

Problemi correlati