5

我的目标是使用 C# ASP.NET MVC 将 148 万个项目从 XML 文件加载到内存中的通用集合字典中,并能够将过滤器列表呈现到视图中。现在它可以在我的字典中以 VS 调试模式作为单个用户处理大约 1/2 百万个项目。再出现内存不足错误 - 现在我得到: myDictionary.Count 导致 System.TypeInitializationException - '函数评估因内存不足异常而被禁用。

过去,在从 XML 加载到 Dict 期间,mscorlib.dll 也会抱怨内存不足。

我有足够的系统内存,我怎样才能给这个 MVC Web 应用程序更多?顺便说一句,我尝试将 XML 转换为 Perl 字典,它适用于 150 万个对象 - 没问题。我不想用 Perl 编写我的应用程序。如果 Perl 能做到,C# 也必须能做到——我只是还没能找到搜索网络的解决方案。

示例代码:

Dictionary<string, msg> masterDictionary = new Dictionary<string, mgs>();

foreach (string file in filePath)
{
    XDocument xdoc = XDocument.Load(file);
    Dictionary<string, msg> fileDictionary = xdoc
        .Descendants("msg")
        .ToDictionary(m => m.Element("msgId").Value,
                      m => new msg
                           {
                               msgId = m.Element("msgId").Value,
                               msgType = m.Element("msgType").Value,
                               name = m.Element("name").Value
                           });

    //now insert your new values into the master
    foreach(var newValue in fileDictionary)
        masterDictionary.Add(newValue.Key, newValue.Value);
}
4

2 回答 2

7

确实解决了问题。在调试模式下,我仍然受限于 VS 2013 中的 2 GB 内存。但是,在部署到 IIS7.5、2008 R2 Server 和 App 时。dot net 4.0x 池,我可以为我的网站使用更多内存。在我的 web.config 中采用了以下设置。我现在需要将我的物理空间从 8 GB 提升到 16 GB;但是,那是另一回事。解决方案:

<gcAllowVeryLargeObjects enabled="true" />

https://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx

于 2013-11-01T22:57:58.493 回答
0

在 BeginUpdate() 和 EndUpdate() 之间,垃圾收集为我解决了 32 位和 64 位的问题。GC.Collect(); GC.WaitForPendingFinalizers();

于 2017-11-24T17:48:55.747 回答