简单的C#数组抛出OutOfMemory异常

Bri*_*gon 5 .net c# arrays out-of-memory

我有一个相当大,相当简单的数组,它跟踪750,000个条目.在64位.NET中它运行良好; 但是在32位客户端上,它失败并出现OutOfMemory异常.我知道我的记忆力不足.需要此程序的客户端,不能使用64位版本.

以下伪代码编译(编辑:原始代码由于拼写错误而无法编译,已修复),并且在两台计算机上针对x86体系结构时抛出相同的异常:

  • Windows XP,32位计算机,运行4 GB RAM和.NET Framework 4
  • Windows 7,64位计算机,运行8 GB RAM和.NET Framework 4

编辑:将编译器标志显式切换为目标x64体系结构允许它在Windows 7,64位计算机上运行.

using System;

public class Storage
{
    Storage futureStorage;
    int count;
    int years;
    bool isTest;
    bool isSet;
}

public static class Program
{
    public static void Main()
    {
        Storage[] storageArray = new Storage[750000];
        for (int i = 0; i < 750000; i++)
        {
            storageArray[i] = new Storage();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


编辑:

运行此代码的网络是一个封闭的网络,没有外部网络连接,因此发布更精确的代码和相关的异常详细信息更多的是我正在处理的过程.我确实有intellitrace运行,有完整的调试符号和一些编译器开关,一旦我将它移植到互联网连接网络,就会有更多细节.


在这两台机器上,代码在693,000的索引周围爆炸(在XP上为693,002,在Windows 7上为693,646).

任何人都有任何想法可能是什么问题?当我在代码之后进行转储和配置文件时,我几乎不使用25 MB的RAM.

如果我买了任何东西,我会切换到不安全/不受管理,但我唯一的尝试是让我无法使用我的存储类.

更新:

似乎有几个人无法复制问题(包括我自己在不同的机器/网络上).

但是,我想出了一个解决方案(使用LINQ)来缓解问题,它现在只抛出异常1/5左右,任何人都知道是否有任何问题或警告我应该注意使用此解决方案,以及为什么内部它可能比另一个更有用吗?

using System;
using System.Linq;    

public class Storage
{
    Storage futureStorage;
    int count;
    int years;
    bool isTest;
    bool isSet;
}

public static class Program
{
    public IEnumerable<Storage> storageEnumerable;
    public static void Main()
    {
        storageEnumerable = (from x in  Enumerable.Range(0, 750000) select new Storage() {count = x});
        foreach (Storage s in storageEnumerable)
            Console.WriteLine(x);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的LINQ代码使用的内存少得多,但异常仍然存在; 并且仅在此网络中的计算机上,而不是在网络外部的其他计算机上(或在IIS应用程序池中).

考虑到其他用户已经报告无法重现该错误,它似乎可能是环境或硬件特定的.是否有网络监控工具或反病毒程序触发这两个代码实现?如果是这样,是否有更好的/推荐的方法来初始化数组,以便我避免这种情况?

use*_*625 1

也许这会有帮助?

数组可以容纳的最大大小是多少?

答案是使用 List 可能会使用更少的内存。