C# C语言中的几个大型内存字典对象导致应用程序性能下降#

C# C语言中的几个大型内存字典对象导致应用程序性能下降#,c#,dictionary,object,optimization,C#,Dictionary,Object,Optimization,我正在开发一个winforms应用程序,我必须从Web API调用加载数据。数百万行数据将被返回,并且必须存储在字典中。逻辑是这样的。用户将单击一个项目并加载数据。如果用户单击另一项,将创建另一个新词典。在此过程中,将创建几个这样的重量级词典对象。用户可能在一段时间后不再使用旧的Dictionary对象。这是使用WeakReference的情况吗?。请注意,重新创建任何Dictionary对象都需要10到20秒。如果我选择将所有对象保留在内存中,应用程序性能会在一段时间后缓慢下降。这里的答案是使

我正在开发一个winforms应用程序,我必须从Web API调用加载数据。数百万行数据将被返回,并且必须存储在字典中。逻辑是这样的。用户将单击一个项目并加载数据。如果用户单击另一项,将创建另一个新词典。在此过程中,将创建几个这样的重量级词典对象。用户可能在一段时间后不再使用旧的Dictionary对象。这是使用WeakReference的情况吗?。请注意,重新创建任何Dictionary对象都需要10到20秒。如果我选择将所有对象保留在内存中,应用程序性能会在一段时间后缓慢下降。

这里的答案是使用更先进的技术

使用内存映射文件将字典存储在磁盘上;这样,您就不必担心一次将它们全部保存在内存中,因为操作系统会根据需要对它们进行交换

您需要编写一个专门设计用于在内存映射文件区域中操作的字典,以及一个用于在字典中存储键值对指向的内容的堆。因为您没有删除任何内容,所以这实际上非常简单


否则,您应该采纳Fildor 4的建议,只使用数据库,因为它基本上可以为您完成我刚才提到的一切,并用一个好的语法将其包装起来。

“这是使用WeakReference的情况吗?”-我想说这是使用数据库的情况。为什么需要加载这么多数据?用户是否要查看这些百万行?我认为您存在投影问题
。请注意,重新创建任何Dictionary对象都需要10到20秒。那么它就不适用于
WeakReference
。一个
WeakReference
-ed对象创建应该很便宜。不管怎么说,如果你需要一个
weakrefence
,这是一个危险信号,表明设计有问题。API会强迫你获取所有数据吗?或者可以引入分页吗?是否有任何解决方案可以作为此实现的参考?