gpt4 book ai didi

.net - 寻找一种将大量对象加载到 .NET 中的 IDictionary 的技术

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:35:56 25 4
gpt4 key购买 nike

我需要将大约 600 万个对象加载到字典中。我遇到的问题是,在构造它们时将它们简单地添加到字典中会导致内存碎片,因为字典会分配新数组并释放现有数组。最后,由于空闲内存的碎片,我只能将 200 万个加载到内存中。问题是我不知道元素的实际数量。这一切都取决于用户输入。

我不太完美的解决方案是这样的:
1. 使用链表来存储所有对象,一旦它们被创建。我这样做是因为链表不需要连续的可用空间
2. 创建一个具有所需大小的字典,因此不需要重新分配内部字典数组
3. 将对象复制到字典中。这样一来,我最多可以加载300万

关于如何改进它有什么建议吗?或者,您是否知道在内部不使用数组的免费 IDictionary 实现。

谢谢

更新:我的键是固定长度的字符串,具体取决于值类型。通常长约 8 个字符,但最多可达 20 个字符。并且,随着 key 长度的增加,可能的项目总数呈爆炸式增长。幸运的是,当前的最大项目数是 12M。该值是一个类类型,每个实例的总大小约为 90-120 字节

这是一个在 32 位 Windows 上运行的 winforms 应用程序。而且,我的典型主机有 2G 内存。在占用大量空间的应用程序中存在大量内存浪费。不幸的是,我现在无法解决这些问题。

最佳答案

整个碎片问题可以通过使用容量来解决:

var d = new Dictionary<int, string>(expectedCapacity);

expectedCapacity应该悲观地计算并留出一点空间。

但是当它与引用类型和/或小值类型一起使用时,这应该不会有太大区别。我认为你应该重新检查你的诊断。

碎片只是大对象堆上的一个问题,600 万个 K,V 对(~ 6M * 20 = 120 MB)不应该这样做。

但是请注意 Dictionary 是如何增长的:当它装满时它会翻倍。因此,当加载(稍微多一点)8M 项目时,您最终可能会拥有 16M 的容量,而 8M、4M、2M 等 block 也放置在 LOH 上。
这可能会导致 OOM。

因此,提前估算项目数量是非常值得的。

关于.net - 寻找一种将大量对象加载到 .NET 中的 IDictionary 的技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7467328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com