大きなタイル画像の再サンプリングされた領域を処理するJavaアプリケーションがあります。最後に使用された要素を効率的に見つけることによってキャッシュ(マップ)を小さく維持する
連続した領域クエリは互いにしばしば近いため、イメージタイルをハッシュマップにキャッシュするのが理にかなっています。今、私はこのキャッシュを無限に成長させないようにしたいと思います。
パフォーマンスを落とさないためには、最も長い時間アクセスされていないマップ要素を見つけるO(1)/ O(logN)メソッドが必要です。これを行う方法はありますか?また、キャッシュからランダムな要素を削除するだけと比較する方法はありますか?
ヒープまたはbstを使用すると、最後にアクセスされたアクセスのリストを並べ替えることができますが、そのうちの1つのアクセスを最後に更新すると線形時間がかかります。最も長い時間前にロードされた画像は、ちょうど秒前にアクセスされた可能性があるため
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。何を考えています? – DeinFreund
古い要素を削除する必要がある場合は、_exact_基準で質問を更新してください。ただし、これを処理するためのコード/状態さえ持っていない場合もあります。その場合は、それを追加して質問を更新する必要があります。 –