Büyük bir çini görüntüye yeniden örneklenmiş alanlar sunan bir java uygulamasına sahibim.Son kullanılan öğeyi verimli bir şekilde bularak önbelleği (harita) küçük tutun
Ardışık alan sorguları genellikle birbirine yakın olduğu için, görüntü eşiklerini bir karma haritada önbelleğe almak anlamlıdır. Şimdi bu önbelleğin süresiz olarak büyümesini engellemek istiyorum.
Performansı kaybetmemek için, en uzun süredir erişilemeyen harita öğesinin bulunmasıyla ilgili bir O (1)/O (logN) yöntemine ihtiyacım var. Bunu yapmanın bir yolu var mı ve rasgele öğeleri önbellekten kaldırmaya nasıl benziyor?
Bir yığın veya bst, son erişilenler listesini sıralamamı sağlar, ancak bunlardan birinde son erişimin güncellenmesi doğrusal zaman alır. En uzun süre önce yüklendi görüntü sadece bir saniye önce erişilmiş olabilirdi çünkü
Map<Point, BufferedImage> loadedImages = new ConcurrentHashMap<>();
Deque<Point> lastUsed = new ConcurrentLinkedDeque<>();
int getRGB(double tileX, double tileY) {
Point point = new Point((int) tileX, (int) tileY);
if (!loadedImages.containsKey(point)) {
loadedImages.put(point, ImageIO.read(new File("R:\\tiles\\22\\" + point.y + "_" + point.x + ".jpg")));
lastUsed.addLast(point);
}
BufferedImage img = loadedImages.get(point);
if (loadedImages.size() > 1000) {
loadedImages.remove(lastUsed.pollFirst());
}
//do stuff with img
}
Bu optimum değildir:
İşte şu anda kullanıyorum koddan bir alıntı.
Hangi dili kullanıyorsunuz? Örneğin Java, 'Collections' sınıfında bazı seçeneklerle birlikte gelir. –
Evet, Java. Ne hakkında düşünüyorsun? – DeinFreund
Bir eski öğenin kaldırılması gerektiğinde sorunuzu _exact_ ölçütleriyle güncelleyin. Unutmayın, bunu işlemek için kod/durum bile olmayabilir, bu durumda bunu eklemeniz ve ardından sorunuzu güncellemeniz gerekir. –