【发布时间】:2016-03-28 01:20:17
【问题描述】:
我有一个 Java 应用程序,它为大平铺图像的重新采样区域提供服务。
由于连续的区域查询通常彼此靠近,因此将图像切片缓存在哈希图中是有意义的。现在我想阻止这个缓存无限增长。
为了不损失性能,我需要一个 O(1)/O(logN) 方法来查找最长时间未访问的地图元素。有没有办法做到这一点,它与仅从缓存中删除随机元素相比如何?
堆或 bst 将允许我保持上次访问列表的排序,但在其中一个中更新最后一次访问需要线性时间。
这是我目前使用的代码的摘录:
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
}
这不是最佳选择,因为加载时间最长的图像可能在一秒钟前才被访问。
【问题讨论】:
-
您使用什么语言?例如,Java 在其
Collections类中附带了一些选项。 -
是的,Java。你在想什么?
-
用确切标准更新您的问题,了解何时应删除陈旧元素。请记住,您甚至可能还没有处理此问题的代码/状态,在这种情况下,您应该添加它,然后更新您的问题。
-
看看here.
-
LinkedHashMap 似乎完全符合我的要求,doesn't seem to be a synchronized implementation though。
标签: algorithm caching data-structures