iamserge
@iamserge

C# и OutOfmemoryExtension — как перейти на полноценные 64х?

Собственно я пользователь "Microsoft Visual Studio Community 2022 (64-bit)" ... Но одолела меня проблема System.OutOfMemoryException хотя памяти свободной аж 60Gb, которой так много именно для того чтобы не скромничать и ворочать словари по 60М+ записей. Нашел статью более менее по теме. И даже намного более общую.

Итого есть кажется две беды:

1. Нужно обязательно х64 систему (она есть), х64 среду (ведь отладка идет и среда тоже работает пока я творю эти большие списки), х64 приложение что кажется универсальное и на скрине я нашел только одну галочку по теме из всего что касается моего приложения - не уверен что оно х64 га самом деле. Галочку я снял и попробовал еще разок - ... кажется помогло и словарь на котором я стабильно спотыкался был обработан ...

631737229be11618886064.png

2. Нужен некий "непрерывный блок памяти" этого самого большого размера ... Речь идет о фрагментации подобно HDD как это было много лет назад кажется и вот беда я без понятия как с этим управляться.

То есть у меня есть память, резерв на эти дела аж 32Gb, то есть именно на эти списки и они еще ни разу не превышали 3,7Gb на деле, а ошибки я уже ловлю. В общем памяти много и хочется ей пользоваться а не перебирать все по 200-300Мб, боясь лишний раз чего то привысить.

Мне кажется что сейчас моя беда в том - что я где-то не включил для моего приложения х64, то есть это не полноценное приложение которое может использовать очень много памяти. Либо сама среда хоть и х64 - я запустил ее неверно или же работает она в неверно режиме х32 ...

Вопрос - как убедиться что моя VS2022 реально работает в х64 и если надо изменить на этот режиме работы. Где проверить что мое приложение тоже х64 и если надо перевести его в такой же режим работы? То есть чтобы и среда и приложение могли адресовать намного более 4Гб без всяких проблем, т.к. я уповаю что среди 32Gb минимум (а то и более чаще) они как то найдут себе "непрерывный" кусочек сами и без проблем все туда сложат ...

Вопрос по второй проблеме - я вообще могу как то помочь программе найти "цельный" кусок памяти? Т.е. заведомо я даю ей с запасом места ... может чистить как-то, может еще что ...

p.s. Объем данных на котором была обшибка как раз около 5-6Гб и пока вроде работает. НО!!!! Мало ли может мне повезло просто и я вот вот опять не буду иметь "цельного" куска памяти и опять все начнет ломаться на ходу ...

p.s.s. То есть пока работает, но я первый раз пишу такое крупногабаритное приложение и чувствую что мне сейчас кажется повезло, чем я и правда в курсе как этот процесс с памятью взять под контроль =((
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 2
Ну без кода сказать в чём конкретно проблема нельзя, но вот пара советов:

1. Убедись что Target platform у тебя x64 (Но вообще, если у тебя dotnet core, то он и так и так не будет упираться в 4гб)
2. Убедись, что где-то в недрах у тебя не выделяется массив более чем на int.MaxValue элементов (внутри словарей массив, если мне память не изменяет)
3. Убедись, что это ошибка именно из рантайма приходит, а не выкинуто где-то явно
4. Попробуй как-нибудь разделить свои данные, чтобы для их хранения не требовался непрерывный кусок памяти.
5. Если ты используешь net framework, а не net core, то тебе нужно в конфиге явно указать, что ты хочешь создавать объекты более 2гб размером.
https://docs.microsoft.com/en-us/dotnet/framework/...

VS2022 и так x64, да и даже если бы была х32, как в 2019 - это бы не повлияло на само приложение.
Ну и возьми dotMemory, чтобы продиагностировать проблемы в работе с памятью.
Ответ написан
freeExec
@freeExec
Участник OpenStreetMap
Фрагментация существует в самой памяти ОС, там вполне может не оказаться таких больших непрерывных блоков.
Чтобы убедиться в том что приложение 64-битное, надо смотреть флаги в его PE-заголовке. Или на худой конец в диспетчере задач, он подписывает 32-битные.
Тулза от людей из микрософт, которая показывала дефрагментацию оперативной памяти, там полный швах.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы