【发布时间】:2017-03-13 11:10:52
【问题描述】:
C# 中Hashset<string> 的内存限制是什么?
我已经看到 .NET 每个对象的内存限制为 2Gb?这些信息仍然准确吗?它适用于 Hashsets 吗?
我目前正在开发一个适用于大型哈希集的应用程序,我已经看到,一旦我为 64 位环境构建 dll,我只有在我的 8GB RAM 笔记本电脑达到其内存限制时才会出现 OutOfMemory。
如果我有 16Gb RAM,对象会不会增加,直到达到硬件限制?
【问题讨论】:
-
2GB 限制是针对单个对象的,例如会影响数组的最大大小。但是,如果您存储在哈希集中的
T是类,那么只有 32 位或 64 位引用存储在哈希集中,实际对象实例及其大小在哈希集。 OutOfMemory 通常意味着 .NET 确实内存不足,它绝不应该意味着某个任意对象决定这是它可以达到的最高值。 -
@LasseV.Karlsen 它可以合法地抛出,因为某些支持内部结构无法调整大小;不知道
HastSet<T>是怎么实现的,但是可行 -
很难想象这样一种场景,即在用完存储字符串的地址空间之前用完 HashSet。您必须存储小字符串,很难保持它们的唯一性。如果平均字符串长度为 10 个字符,那么仅字符串就需要 10 GB。顺便说一句,GC 非常粗糙。 64 位程序中的可用地址空间受到最大页面文件大小及其增长速度的限制。
-
磁盘是总是需要大量内存的程序的解决方法。无论是分页文件、平面文件还是 dbase,实际上都没有任何区别。
标签: c# .net performance hashset bigdata