达到 .NET 词典限制——具体是什么?

Hitting .NET Dictionary limit – what exactly?

在 x64 .NET 控制台应用程序中,我将大型查找 table 加载到 Dictionary<object, object> 中。在这种特殊情况下,键和值都是字符串,但应用程序需要是不可知的。字符串是 12 个单字节字符和 15-17 个单字节字符(数字和 a-z)。查找 table 包含约 5500 万条记录。

我需要将它加载到 RAM 中以提高性能,DB 不会很好。

问题是在加载大约 4900 万条记录后,我从 Dictionary 中得到了一个超出范围的异常。此时,该进程的提交大小约为 8 GB。 运行 所在的服务器有 24 GB RAM,还有很多剩余空间。 OS 和应用都是 64 位的。

我尝试在 3000 万个项目之后拆分为第二个 Dictionary,这是可行的,因此它本身并不是 RAM 限制。必须是 Dictionary.

中的限制

我想知道这可能是什么限制。有什么想法吗?

也许您可以尝试更改字符串的哈希码。字符串的大小写代码相差 0x20。忽略大小写的一种快速方法是在散列之前将每个字符与 0x20(对于小写)进行 OR 或者将每个字符与 ~0x20(对于大写)进行 AND。

另外,C# 不是为处理数百万、数十亿条记录而设计的。也许尝试将其存储在 SqlLite 中并分批获取。 Sql 非常适合处理数百万条记录。

我最近遇到一个问题,需要查询数百万条记录以查找记录是否存在。我最终使用 Bloom Filter 来判断记录是否不存在。

MS docs 表示:

Arrays greater than 2 GB in total size are not enabled. This is the default.

很可能您遇到了这个限制。您可以通过在您的应用程序配置中添加以下内容来覆盖该行为:

<gcAllowVeryLargeObjects enabled="true" />