2010-01-14 74 views
3

相关使用情况:缓存和计算映射

read input 

if (correlation-id is already generated for this input) 
{ 
    lookup the correlation-id from the cache; 
    return correlation-id; 
} 

else 
{ 
    generate the correlation-id; 
    cache it; 
    return correlation-id; 
} 

约束: - 输入记录的数量可以去,直到500K因此不希望使用 强引用。 - 不希望产生一个单向哈希截至目前(我知道,如果我们 使用单向散列那么就没有必要缓存)

有人能告诉我如何使用ComputingMap这一点。我在问这个 ,因为javadoc中有一个注释说“它使用弱/软按键的等同性 ”。

+0

什么类型的对象是你的钥匙和价值观? – 2010-01-15 00:08:57

+0

现在的关键是一个Tuple对象(正确覆盖equals和hasCode)。你为什么问?是基于我用于键的输入类型的用法。 该值始终是一个字符串 – 2010-01-15 00:13:15

+0

那么,就您而言,我不确定弱或弱的引用有多大意义。无论您的特定元组或id字符串是否发生垃圾收集,似乎都与您是否希望条目在缓存中被认为是陈旧的无关。您可以考虑使用过期时间(例如'.expiration(10,TimeUnit.MINUTES)')。将来你可以指定一个大小上限。 – 2010-01-15 21:16:56

回答

3

使用Google Guava/Collection类和软键或弱键或值,您的键需要是强大的引用,以便使用equals()而不是==来查找缓存的值。如果你有弱/软键,那么查找是以身份完成的,所以你总会得到一个缓存未命中。所以如果你想让垃圾收集器从你的缓存中获取GC项目,那么你需要使这些值变软或变弱。

我知道Google会在将来添加等效功能,以便您可以声明是否需要equals()或==,而不是通过选择强,弱或软引用为您做出此选择。

由于你的元组对象实现equals()和hashCode()方法,那么你只是做

new MapMaker() 
    .softValues() 
    .makeComputingMap(new Function<Tuple,String>() { 
             public String apply(Tuple t) { 
              // generate the correlation-id 
             } 
            }); 
+0

所以你建议有强大的键和软值。强关键becaz我想使用等于()和软值来利用内存efiicieny ... 但我仍然不明白为什么身份相等被默认使用。有人可以请解释 – 2010-01-15 01:25:11

+0

是的。这是Google MapMaker的一个缺点,您无法选择等效性测试:strong => equals,weak或soft => ==。我知道他们正在努力。 您可以使用JDK并发组中的extra166y并使用其CustomConcurrentHashMap。它提供了可以使用的其他等效功能。 使用extra166y的一个缺点是它不会在Web应用程序上下文中卸载自身,也无法停止收集线程。 http://gee.cs.oswego.edu/dl/concurrency-interest/ – 2010-01-15 05:24:03

+0

这不是缺点。这是功能。他们说一张软/弱键的地图是错误的。查看Joshua对关于Google Collections的视频的评论。并不难删除该功能并使用等号后退。您可以在本文底部看到我的修改后的'MapMaker.jar':http://satukubik.com/2009/11/13/computing-map-on-google-collections/ – nanda 2010-01-15 05:50:23