Per*_*ika 3 c# dictionary limit
我正在使用字典,我需要存储近13 000 000个密钥.不幸的是,在添加11 950 000个密钥之后,我得到了一个例外"系统内存不足".有这个问题的解决方案吗?我将需要我的程序在比未来实际上更少的可用计算机上运行.
我需要那么多密钥,因为我需要存储对 - 序列名称和序列长度,它用于解决生物信息学相关的问题.
任何帮助将不胜感激.
购买更多内存,安装64位版本的操作系统并重新编译为64位.不,我不是在开玩笑.如果你想要这么多物品......在ram ......然后称它为"特征".如果新的Android可以需要16GB的内存来编译...
我忘记了......你可以从读取C#数组的对象开始,非常大,寻找更好的方法
你知道有多少是1300万个物体吗?
为了进行比较,32位Windows应用程序可以访问少于2 GB的地址空间.所以它是20亿字节(给予或接受)...... 20亿/ 1300万=大约150字节/对象的东西.现在,如果我们考虑一个引用类型占用多少...吃150个字节很容易.
我会添加一些内容:我已经查看了我的内容Magic 8-Ball并告诉我:向我们展示您的代码.如果您没有告诉我们您使用的钥匙和价值,我们应该如何帮助您?你在使用,class或struct或者"原始"类型?告诉我们你TKey和你的"大小" TValue.可悲的是,昨天我们的水晶球破了:-)
C#不是一种旨在解决重型科学计算问题的语言.绝对有可能使用C#来构建满足您需求的工具,但像Dictionary这样的现成部件旨在解决更常见的业务问题,例如将邮政编码映射到城市等等.
您将不得不使用某种外部存储.我的建议是购买数据库并用它来存储你的数据.然后使用DataSet或类似技术将部分数据加载到内存中,对其进行操作,然后将更多数据从数据库中倒入DataSet,依此类推.
小智 5
好吧,我几乎完全一样的问题.
我想从数据库中将大约1250万[string,int] s加载到一个字典中(对于上面所有不明白原因的编程"众神",答案是当你使用150时它会非常快) GB数据库,如果可以缓存内存中一个密钥表的一部分).
它令人烦恼地在几乎相同的地方抛出一个内存不足 - 即使这个过程只消耗了大约1.3 GB的内存(在db读取方法明智地改为内存后减少到大约800 MB内存)不要尝试一次完成所有操作) - 尽管在I7上运行8 GB内存.
解决方案实际上非常简单 - 在解决方案资源管理器的Visual Studio(2010)中右键单击项目并选择属性.在Build选项卡中,将Platform Target设置为x64并重建.
它会在几秒钟内完成对字典的加载,并且字典性能非常好.
doc*_*ess -1
有了这么多的键,您应该使用数据库或类似 memcache 的东西,同时交换存储中的缓存块。我怀疑你是否需要同时使用所有项目,如果你这样做,它就不可能在内存很少的低功率机器上运行。