.NET Cache:最大元素数

时间:2013-10-25 14:21:48

标签: .net caching

.NET Cache中是否有最大数量的键/元素?如果是,那么限制是多少?我不是指以MB为单位的Cache的最大大小。

1 个答案:

答案 0 :(得分:0)

由于它们的实现不知道对象占用了多少字节(可以弄清楚,但不可用于开箱即用),因此不能以字节为准确的限制。没有内置功能,如" sezeofobject(参考)"因为无法说出"对象结束的位置"。假设您有一个指向其他3个对象的对象,它们是否应被视为原始对象的一部分?

无论如何,虽然可以间接评估缓存解决方案需要多少ram,但是不可能准确地做,例如,可以只使用反射来计算字段数并使用sizeof()原始类型等等。但是,这将给出一个球场号码。

我们如何解决这个问题 - 我们序列化我们保存在byte []中的对象 - 用一颗子弹杀死许多兔子:

  • 从缓存返回的对象是"不可见"到GC而不是 对图遍历施加任何内存压力
  • 我们可以确切知道对象图占用的字节数
  • 从缓存返回的对象是100%线程安全副本

最大的问题是GC。

随.NET提供的缓存类很方便,但存在一个主要问题 - 它们无法长时间存储大量数据(数千万+),而不会终止GC。如果你缓存几千个对象,它们工作得很好,但是当你移动到数百万个并保持它们直到它们传播到GEN2时 - 当系统达到低内存阈值并且GC需要扫描时,GC暂停最终会变得明显所有的一族。

实用性是这样的 - 如果你需要存储几十万个实例 - 使用MS缓存。如果您的对象是2字段或25字段无关紧要 - 它与引用的数量有关。

另一方面,有些情况下需要使用目前常见的大型RAM,即64 GB。为此,我们创建了一个100%托管的内存管理器和缓存,位于它之上。

我们的解决方案可以轻松地在内存中存储300,000,000个对象内存,而不会对GC造成任何负担 - 这是因为我们将数据存储在大型(250 mb)byte []段中。

以下是代码:NFX Pile(Apache 2.0) https://github.com/aumcode/nfx/blob/master/Source/NFX/ApplicationModel/Pile/ICache.cs

视频:NFX Pile Cache - Youtube

https://www.youtube.com/watch?v=Dz_7hukyejQ