2017-03-15 5 views
0

私は、ネットワーク共有やインターネットからより速くダウンロードするために画像のキャッシュを行っています。現在、このキャッシュはメモリ内にあります。Javaのオブジェクトの深い(浅い)サイズのキャッシュを制限しますか?

オブジェクトの深いサイズでキャッシュを制限することはできますか(前にはBufferedImageSize)。

キャッシュはDeferredImageは別のスレッドでロードを容易にするBufferedImageのラッパーである

import com.google.common.cache.CacheBuilder; 
import com.google.common.cache.CacheLoader; 
import com.google.common.cache.LoadingCache; 

.... 

imageCache = CacheBuilder.newBuilder() 
     .maximumSize(cacheSize) 
     .expireAfterWrite(10, TimeUnit.MINUTES) 
     .build(
      new CacheLoader<String, DeferredImage>() { 
       public DeferredImage load(String pathname) throws IOException { 
        return new DeferredImage(pathname); 

       } 
      }); 

を次のように初期化されます。

キャッシュのエントリ数ではなくサイズ(バイト単位)を考慮したサイズチェックをコーディングすることは可能ですか?

UPDATE

私はmaximumWeight() methodが見つかりましたが、この場合、私は探しています何を理解していなかった:どこのドキュメントは、重みの合計が計算されていることを、述べています。

答えて

1

短い説明がCaches Explained - size based evictionである:異なるキャッシュエントリが異なる「重み」を持っている場合

代わりに、 - あなたのキャッシュ値は根本的に異なるメモリフットプリントを持っている場合たとえば、 - あなたは重み関数を指定することもCacheBuilder.weigher(Weigher)、最大キャッシュウェイトはCacheBuilder.maximumWeight(long)です。 maximumSizeと同じ警告に加えて、重みは入力作成時に計算され、その後は静的であることに注意してください。あなたのケースでは

それはのようなものです:

imageCache = CacheBuilder.newBuilder() 
    .maximumWeight(maximumCacheSizeInBytes) 
    .weigher(new Weigher<String, DeferredImage>() { 
     public int weigh(String k, DeferredImage g) { 
      return g.size(); 
     } 
    }) 
    .build(
     new CacheLoader<String, DeferredImage>() { 
      public DeferredImage load(String pathname) throws IOException { 
       return new DeferredImage(pathname); 

      } 
     }); 

サイズは、値がキャッシュに挿入されたときに知られている必要があるため、値DeferredImage用タイプは、いくつかの問題を引き起こす可能性があります。キャッシュに挿入されるスレッドは、サイズがわかるまでブロックされるため、ロードのために余分なスレッドを持つことは役に立たなくなります。言及する価値があるかもしれない

代替:

カフェインのAPIや機能グアバキャッシュに似ていますが、非同期ローダーをサポートしています。これにより、画像読み込みスレッドの数をより適切に制御できます。

EHCacheは、値のメモリ消費量を分析してサイズベースの追い出しを提供するので、Weighter関数は必要ありません。

関連する問題