【发布时间】:2016-06-07 22:09:12
【问题描述】:
给定(简化描述)
我们的一项服务在内存中有很多实例。大约 85% 是独一无二的。 我们需要对这些项目非常快速的基于键的访问,因为它们在单个堆栈/调用中经常被查询。这个单一上下文的性能得到了极大的优化。
所以我们开始将它们放入字典中。表现还可以。
在这种情况下,尽可能快地访问项目是最重要的。保证读的时候没有写操作。
问题
与此同时,我们达到了字典可以存储的项目数量的限制。
Die Arraydimensionen haben den unterstützten Bereich überschritten.
bei System.Collections.Generic.Dictionary`2.Resize(Int32 newSize, Boolean forceNewHashCodes)
bei System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
翻译成The array dimensions have exceeded the supported range。
在这种特定情况下,像 Memcached 这样的解决方案太慢了。它是一个封装在单个服务中的孤立的非常具体的用例
因此,我们正在寻找针对这种特定场景的字典替代品。
目前我找不到支持这一点的人。我错过了什么吗?有人可以指点我吗?
作为替代方案,如果不存在,我们正在考虑自行实施。
我们考虑了两种可能性。从头开始构建或包装多个字典。
包装多个字典
当搜索一个项目时,我们可以查看键 HasCode 并使用它的起始编号作为包装器字典列表的索引。虽然这似乎很容易,但我觉得这很容易,这意味着哈希码被计算了两次(一次由我们计算一次,一次由内部字典计算)(这种情况真的对性能至关重要)。
我知道像字典一样交换基本类型是绝对最后的可能性,我想避免它。但目前似乎没有办法让对象更加独特,或者从数据库中获取字典的性能,或者在其他地方保存性能。
我也知道“注意优化”,但较低的性能会严重影响其背后的业务需求。
【问题讨论】:
-
字典已经使用 HashCodes 将条目分成多个独立的桶。
-
@BoasEnkler 哦,好吧。在那种情况下,我会认真考虑重写应用程序的“查找”和“存储”部分,并将其封装在一个单独的程序集中,该程序集是用更适合这种性能关键型事物的语言编写的。跨度>
-
@Steffen Winkler,我也在尝试为类似于此处提到的情况找到解决方案。您能否建议“更适合此类性能关键事物的语言”?
-
@KrishnaKumarN 啊抱歉,我没有特别的想法。但我想用 C/C++ 重写它已经可以提高性能。您可以查看this 或类似网站。
标签: c# .net dictionary collections .net-4.6.1