Ограничения памяти - PullRequest
1 голос
/ 22 января 2009

У меня есть приложение, которое я создал для копирования пользователей (более 10000) из одного домена и создания пользователя в другом домене с пользовательскими свойствами.

Приложение работает нормально до тех пор, пока не достигнет 1,7 ГБ памяти. Я знаю, что на 32-битных компьютерах существует ограничение в 2 ГБ на процесс, но я запускаю его на копии Windows Server 2008 x64 с 24 ГБ ОЗУ.

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

У меня установлен проект "Любой ЦП", и он отображается в диспетчере задач без флага * 32.

Может кто-нибудь помочь мне понять, что происходит?

Спасибо

Ответы [ 4 ]

2 голосов
/ 22 января 2009

Разве какая-либо отдельная структура данных в вашей программе превышает 2 гигабайта? Среда выполнения .NET может получить доступ к более чем 2 ГБ, но ни один объект не может иметь размер более 2 ГБ. Например, вы не можете выделить массив байтов размером более 2 ГБ.

Это может сбить вас с толку при использовании коллекций .NET. В частности, общие типы словаря и коллекции HashSet.

Получается ли исключение нехватки памяти при попытке добавить что-либо в коллекцию?

0 голосов
/ 22 января 2009

Независимо от того, следует ли вам превышать лимит, мне кажется, что вы держите ссылки на некоторые объекты, которые вам на самом деле не нужны.

Если вы не знаете, почему вы потребляете так много памяти, вы можете попробовать профилировать использование памяти, чтобы узнать, действительно ли вам нужна эта память. Вариантов много, но Microsoft CLR Profiler бесплатен и будет делать то, что вам нужно.

0 голосов
/ 22 января 2009

Каков ваш источник записей? Можно ли использовать подключенную модель типа DataReader вместо отсоединенной модели типа DataTable / DataSet, чтобы избежать хранения в памяти более текущей записи?

Я сомневаюсь, что у вас просто есть сервер с 24 ГБ ОЗУ, лежащий около , ничего не делающий . У него должна быть какая-то работа, которая требует наличия оперативной памяти для этой цели. То, что у вас достаточно много оперативной памяти на машине, не обязательно означает, что она доступна, или что на нее стоит положиться.

0 голосов
/ 22 января 2009

Основная часть моего приложения проходит через всех 10000+ пользователей, используя DirectorySearcher, затем для каждого найденного DirectoryEntry я создаю учетную запись, используя следующее:

using(DirectoryEntry newUser = root.Children.Add("LDAPPATH"))
{
      //Assign properties to the newUser
      newUser.CommitChanges();
      //write the new username to a file using a streamwriter.
}

Затем я закрываю потоковую запись и в отчете отображается количество созданных пользователей.

У меня размер страницы DirectorySearcher установлен на 110000, чтобы получить все результаты. Мое приложение просто завершает работу, поскольку должно быть только 3500 созданных отчетов.

Я создал простой тест, используя тот же код для DirectorySearcher, и вместо того, чтобы создавать учетные записи, я просто увеличиваю счетчик, счетчик достиг ожидаемого значения, поэтому я думаю, что это должно быть что-то с созданием учетной записи или регистрацией в файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...