2017-03-15 24 views
0

我正在做图像缓存,以便从网络共享和/或互联网更快下载。目前,这个缓存在内存中。通过Java中的对象的深度(相对于浅)来限制缓存?

是否有可能(的prelimilarly BufferedImageSize)对象的深尺寸限制缓存?

缓存被初始化像下面

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); 

       } 
      }); 

哪里DeferredImage是围绕BufferedImage的包装,以方便在不同的线程负载。

是否有可能一些代码大小检查,其中考虑到在高速缓存中没有的条目数,但它们的字节大小?

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功能。