0

を使用して LRU キャッシュを実装するクラスを作成していLinkedHashMapます。通常、オブジェクトがキャッシュに追加されたときにディスクに書き込み、オブジェクトがキャッシュに見つからない場合はディスクからフェッチするために、メソッドputをオーバーライドする必要があります。get

私の LRUCache クラスは次のようになります。

public class LRUCache<K, V> extends LinkedHashMap<K, V>
    implements Serializable {
    /** 
     * File where the elements of the cache are stored
     */
    private File cacheFile = null;

    /**
     * UID of the class for serialization.
     */
    private static final long serialVersionUID = 1L;
    /**
     * Maximum number of entries in the cache.
     */
    private final int maxEntries;

    /**
     * Default constructor of the cache.
     *
     * @param newMaxEntries
     *      the maximum number of entries in the cache.
     */
    public LRUCache(final int newMaxEntries, String fileName) {
        super(newMaxEntries + 1, 1.0f, true);
        this.maxEntries = newMaxEntries;
        this.cacheFile = new File(fileName);
    }


    @Override
    public V get(Object key) {
        V VObject = super.get(key);
        if (VObject == null) {
            // TODO: Fetch from disk

        }
        return VObject;
    }

    @Override
    public V put(K key, V value) {
        // TODO: Write to disk

        return super.put(key, value);
    }

    @Override
    protected final boolean
            removeEldestEntry(final Map.Entry<K, V> eldest) {
        return super.size() > maxEntries;
    }

}

私の質問は、これら 2 つのメソッドをオーバーライドして、できるだけ速く実行する方法です。キャッシュされたオブジェクトが実装するのは良い考えでしょExternalizeうか?

ありがとう

4

1 に答える 1

1

申し訳ありませんが、実際にはここでさまざまな問題を解決する必要があります。

  • 最高/最速のJavaオブジェクトシリアライゼーションは何ですか? 他の質問ですでに議論されています。
  • 以前に書き込まれたオブジェクトをファイルに更新する方法は?
  • 検索が必要な場合、ファイルに保存されているオブジェクトのバイトオフセットを効果的に見つけるにはどうすればよいですか?
  • ファイルからアイテムを削除してファイルを圧縮する方法は?
  • 高速に書き込み、ハードディスク ストレージへのランダム アクセスを回避するにはどうすればよいですか?

データベースに関する本で見つけた最後の質問に対するすべての回答。

あまり頻繁に変更されないビュー オブジェクトがあり、簡単な解決策が必要な場合は、Put ごとに HashMap をファイルにシリアル化するだけです。データが重要な場合は、データの損失を防ぐために、常に新しいファイルを作成し、後で古いファイルを削除することをお勧めします。

ところで: サンプル コード内では、保存されたディスク オブジェクトの削除が欠落しています。

于 2014-02-25T18:58:37.663 に答える