Простой массив C #, генерирующий исключение OutOfMemory

У меня есть довольно большой, довольно простой массив, отслеживающий 750 000 записей. В 64-битной .NET все работает нормально; однако на 32-битном клиенте возникает ошибка OutOfMemory . Я знаю, что у меня не заканчивается память. Клиент, нуждающийся в этой программе, не может использовать 64-битную версию.

Следующий псевдокод компилируется ( править: исходный код не компилировался из-за опечатки, это было исправлено) и выдает то же исключение при нацеливании на x86. архитектура, на двух машинах:

  • 32-разрядная машина Windows XP с 4 ГБ ОЗУ и .NET Framework 4
  • 64-разрядная машина Windows 7 с 8 ГБ ОЗУ и.NET Framework 4

Изменить: Явное переключение флага компилятора на для нацеливания на архитектуру x64 позволяет ему работать на 64-разрядной машине Windows 7.

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();
        }
    }
}


Изменить:

Сеть, в которой работает этот код, является закрытой сетью, без подключения к внешней сети, поэтому публикация более точного кода и соответствующих деталей исключения - это немного больше процесс, над которым я работаю. У меня работает intellitrace с полными отладочными символами и несколькими переключателями компилятора, подробности будут добавлены, как только я перенесу его в сеть, подключенную к Интернету.


На обеих машинах код выдает около 693 000 единиц (693 002 на XP, 693 646 на Windows 7, если быть точным).

У кого-нибудь есть идеи относительно того, в чем может быть проблема? Когда я делаю дамп и профиль после кода, я почти не использую 25 МБ ОЗУ.

Я бы переключился на небезопасный / неуправляемый, если он мне что-нибудь принесет, но единственная попытка, которую я сделал, лишает меня возможности использовать мой класс Storage.

Обновление:

Похоже, некоторые люди не могут воспроизвести проблему (включая меня на другом компьютере / в другой сети).

Тем не менее, я придумал решение (с использованием 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);
    }
}

Приведенный выше код LINQ использует гораздо меньше памяти, но исключение все равно возникает; и только на машинах в этой сети, а не на других машинах вне сети (или в пуле приложений IIS, если на то пошло).

Учитывая, что с тех пор другие пользователи сообщали, что не могут воспроизвести ошибку, возможно, она связана с конкретной средой или оборудованием. Могут ли эти две реализации кода запускаться инструмент сетевого мониторинга или антивирусная программа? Если да, то есть ли лучший / рекомендуемый способ инициализировать массив, чтобы этого избежать?

5
задан leppie 20 May 2014 в 14:52
поделиться