Middle
გეცოდინება, როგორ მუშაობს კეშ-კარტა?
sobes.tech AI
პასუხი AI-სგან
Memory Cache (მეხსიერების ქეში) Android-ში — ეს არის მექანიზმი მონაცემების შენახვისთვის მოწყობილობის ოპერაციულ მეხსიერებაში სწრაფი წვდომისთვის. ის დაფუძნებულია ასოციაციური ქეშის პრინციპებზე.
როგორ მუშაობს:
- მონაცემთა მოთხოვნა: როდესაც აპლიკაცია ითხოვს მონაცემებს, რომლებიც შეიძლება იყოს ქეშში (მაგალითად, სურათი ქსელიდან ან რთული ოპერაციის შედეგი), ის პირველ რიგში ამოწმებს ქეშ-კარტას.
- ძებნა ქეშში: თუ მონაცემები იპოვეს ქეშში (ანუ, მოთხოვნის გასაღები ემთხვევა ქეშის გასაღებს), ისინი დაუყოვნებლივ აბრუნდებიან, თავიდან აიცილებენ ნელი შეყვანა-გამოტანას ან გამოთვლებს. ამას უწოდებენ "cache hit".
- ქეშის გამოტოვება (Cache Miss): თუ მონაცემები არ იპოვეს ქეშში ("cache miss"), აპლიკაცია იღებს მათ ორიგინალ წყაროსგან (სატელეფონო ქსელი, მონაცემთა ბაზა და ა.შ.).
- მონაცემთა შენახვა ქეშში: მიღების შემდეგ, მონაცემები ინახება ქეშ-კარტაში მომავალი მოთხოვნებისთვის იმავე გასაღებით.
- გამოყვანა (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);
}