У меня есть довольно большой, довольно простой массив, отслеживающий 750 000 записей. В 64-битной .NET все работает нормально; однако на 32-битном клиенте возникает ошибка OutOfMemory
. Я знаю, что у меня не заканчивается память. Клиент, нуждающийся в этой программе, не может использовать 64-битную версию.
Следующий псевдокод компилируется ( править: исходный код не компилировался из-за опечатки, это было исправлено) и выдает то же исключение при нацеливании на x86. архитектура, на двух машинах:
Изменить: Явное переключение флага компилятора на для нацеливания на архитектуру 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, если на то пошло).
Учитывая, что с тех пор другие пользователи сообщали, что не могут воспроизвести ошибку, возможно, она связана с конкретной средой или оборудованием. Могут ли эти две реализации кода запускаться инструмент сетевого мониторинга или антивирусная программа? Если да, то есть ли лучший / рекомендуемый способ инициализировать массив, чтобы этого избежать?