1

Java で Flyweight を作成していますが、大きすぎるマップを作成しないようにしたいと考えています。マップを削除するより効率的な方法はありますか? これを自動的に実行できるプロパティ (最大サイズ コンストラクターなど) が見当たらなかったので、コードで実行しています。

これが私が持っているもので、かなり基本的なものですが、より良い方法がないことを確認したいと思います:

private static void prune() {
    Iterator<Entry<Integer, Integer[]>> iterator =  seeds.entrySet().iterator();
    int removed = 0;
    while(iterator.hasNext()|| removed == pruneLength) {
        iterator.next();
        iterator.remove();
        removed++;
    }
}
4

4 に答える 4

5

LinkedHashMap は LRU キャッシュとして使用できます。

Map<Integer, Integer[]> map = createLRUMap(128);

public static <K, V> Map<K, V> createLRUMap(final int maxSize) {
    return new LinkedHashMap<K,V>(maxSize, 1, true) {
        @Override
        protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
            return size() > maxSize;
        }
    };
}
于 2010-12-06T16:33:51.567 に答える
3

GuavaMapMakerには、最新バージョン(トランク上)にこれがあります。それがいつ正確に出てくるかはわかりませんが、r08にあるはずです。

ConcurrentMap<Integer, Integer[]> seeds = new MapMaker()
     .maximumSize(maxSize)
     .makeMap();

これはスレッドセーフな並行マップであることに注意してください。これは、使用方法によっては重要になる可能性があります。

于 2010-12-06T16:46:14.680 に答える
1

EhCacheなどのキャッシュの使用を検討しましたか? それらはマップを実装し、宣言的にサイズ、値がディスクに保存された後の制限などを設定できます。

于 2010-12-06T16:33:49.753 に答える
0

データベースの世界からの 1 つの可能性は、2 つ (または場合によってはそれ以上) のマップを持つことです。ルックアップは両方のマップを使用します。1 つだけに書き込みます。書き込み中のものが容量に達したら、読み取り専用マップを置換/クリアして切り替えます。

于 2010-12-06T16:56:11.923 に答える