Sobes.tech
Middle

Kas sa tead, kuidas vahemälukaart töötab?

sobes.tech AI

Vastus AI-lt

Memory Cache (Mälu vahemälu) Androidis — see on mehhanism andmete salvestamiseks seadme operatiivmälu, et pakkuda kiiret juurdepääsu. See põhineb assotsiatiivse vahemälu põhimõtetel.

Kuidas see töötab:

  1. Andmete päring: Kui rakendus küsib andmeid, mis võivad olla vahemälus (näiteks pilt võrgust või keerulise operatsiooni tulemus), kontrollib see esmalt vahemälu.
  2. Otsing vahemälus: Kui andmed leiti vahemälust (st. päringu võti vastab vahemälu võtmele), tagastatakse need kohe, vältides aeglasi sisendi-väljundi operatsioone või arvutusi. Seda nimetatakse "cache hit".
  3. Vahemälu puudumine (Cache Miss): Kui andmeid ei leitud vahemälust ("cache miss"), saab rakendus need algsest allikast (võrk, andmebaas jne).
  4. Andmete salvestamine vahemällu: Pärast saamist salvestatakse andmed vahemällu tulevasteks päringuteks sama võtmega.
  5. Väljutamine (Cache Eviction): Vahemälu on piiratud suurusega. Kui see täitub, eemaldatakse vanad või vähem kasutatud elemendid, et teha ruumi uutele. Levinud väljutamise algoritmid on — LRU (Vähem hiljuti kasutatud) ja LFU (Vähem sageli kasutatud).

Näide Androidis LruCache kasutades:

// Maksimaalse suurusega `LruCache` loomine
private LruCache<String, Bitmap> memoryCache;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Maksimaalne juurdepääsetav mälu suurus (KB)
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

    // Kasutame 1/8 juurdepääsetavast mälust vahemäluks
    final int cacheSize = maxMemory / 8;

    memoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // Meetod iga elemendi suuruse arvutamiseks vahemälus,
            // vastavalt vahemälu suurusele (siin — KB)
            return bitmap.getByteCount() / 1024;
        }
    };
}

// Elemendi lisamine vahemällu
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        memoryCache.put(key, bitmap);
    }
}

// Elemendi saamine vahemälust
public Bitmap getBitmapFromMemCache(String key) {
    return memoryCache.get(key);
}