我正在为我当前的问题陈述评估Terracotta。这个过程是CPU密集型的,需要大约5-10 GB的工作内存(RAM)。内存中的每个对象都有1千字节大小,并由几个原始数据类型组成。整个RAM数据经历了数千次迭代,每次迭代都会更改所有对象。每个对象都被完全修改。这个过程需要几天的时间才能完成。
million+对象是分区的,现在在多个核心机器上运行,但我需要更多的能力和更多的内存(对于更大的问题)。一个线程处理的数据/对象不与其他线程共享
Terracota是一个很好的解决方案吗?将数百万个对象同步到集群服务器会不会是一个非常糟糕的瓶颈,从而使其效率低下?
发布于 2012-09-28 03:20:54
我认为Terracotta最适合缓存和快速检索。作为put速率,我已经看到每个缓存服务器实例的每秒10K“批处理put”速率。“批量更新”模式意味着您可以将一组条目放入一次,这将比单个put效率高得多。
以下是批处理更新的示例:
cache.setNodeBulkLoadEnabled(true);
try
{
Collection<Element> entries= new ArrayList<Element>();
while (...)
{
entries.add(new Element(key, value));
}
cache.putAll(entries);
}
finally
{
cache.setNodeBulkLoadEnabled(false);
}此外,Terracotta还具有BigMemory特性,能够使用JVM堆之外的内存。要启用它,你必须在你的ehcache.xml中添加:
<cache name="com.xyz.MyPOJO" maxMemoryOffHeap="3g">
<terracotta/>
</cache>上面的例子将在你的JVM之外使用3Gig的内存。一般来说,堆大小不应该大于4G,否则JVM会在GC...which上花费大量的周期,这会进一步减慢计算速度。
check的另一个替代方案是“计算/数据网格”解决方案。您可以从http://www.gridgain.com和http://www.gigaspaces.com开始
https://stackoverflow.com/questions/11412248
复制相似问题