Sobes.tech
Middle

გეცოდინება, როგორ მუშაობს კეშ-კარტა?

sobes.tech AI

პასუხი AI-სგან

Memory Cache (მეხსიერების ქეში) Android-ში — ეს არის მექანიზმი მონაცემების შენახვისთვის მოწყობილობის ოპერაციულ მეხსიერებაში სწრაფი წვდომისთვის. ის დაფუძნებულია ასოციაციური ქეშის პრინციპებზე.

როგორ მუშაობს:

  1. მონაცემთა მოთხოვნა: როდესაც აპლიკაცია ითხოვს მონაცემებს, რომლებიც შეიძლება იყოს ქეშში (მაგალითად, სურათი ქსელიდან ან რთული ოპერაციის შედეგი), ის პირველ რიგში ამოწმებს ქეშ-კარტას.
  2. ძებნა ქეშში: თუ მონაცემები იპოვეს ქეშში (ანუ, მოთხოვნის გასაღები ემთხვევა ქეშის გასაღებს), ისინი დაუყოვნებლივ აბრუნდებიან, თავიდან აიცილებენ ნელი შეყვანა-გამოტანას ან გამოთვლებს. ამას უწოდებენ "cache hit".
  3. ქეშის გამოტოვება (Cache Miss): თუ მონაცემები არ იპოვეს ქეშში ("cache miss"), აპლიკაცია იღებს მათ ორიგინალ წყაროსგან (სატელეფონო ქსელი, მონაცემთა ბაზა და ა.შ.).
  4. მონაცემთა შენახვა ქეშში: მიღების შემდეგ, მონაცემები ინახება ქეშ-კარტაში მომავალი მოთხოვნებისთვის იმავე გასაღებით.
  5. გამოყვანა (Cache Eviction): ქეშს აქვს შეზღუდული ზომა. როდესაც ის ივსება, ძველი ან ნაკლებად გამოყენებული ელემენტები ამოიღება, რათა ადგილი დაუთმოს ახალს. გავრცელებული ალგორითმები — LRU (მცირე გამოყენება ბოლო დროს) და LFU (მცირე გამოყენება ხშირად).

მაგალითი Android-ში LruCache გამოყენებით:

// მაქსიმალური ზომის მქონე LruCache-ის შექმნა
private LruCache<String, Bitmap> memoryCache;

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

    // მიღება მაქსიმალური ხელმისაწვდომი მეხსიერების ზომა (KB)
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

    // გამოყენება 1/8 ხელმისაწვდომი მეხსიერების ქეშისთვის
    final int cacheSize = maxMemory / 8;

    memoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // მეთოდი თითოეული ელემენტის ზომის გამოთვლისთვის კეშში,
            // შესაბამისი კეშის ზომასთან (აქ — KB)
            return bitmap.getByteCount() / 1024;
        }
    };
}

// ელემენტის დამატება კეშში
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        memoryCache.put(key, bitmap);
    }
}

// ელემენტის მიღება კეშიდან
public Bitmap getBitmapFromMemCache(String key) {
    return memoryCache.get(key);
}