Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 3

Изменение объёма памяти при OutOfMemoryException

13.02.2016, 17:33. Показов 1914. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех.
Проблема такова: я сделал add-in для MS Word, который в некоторых случаях очень требователен к памяти. Соответственно, часто возникает OutOfMemoryException. Я пытаюсь с ним бороться частой принудительной сборкой мусора (GC.Collect), но не очень преуспел. Также логирую объём свободной оперативки - и отмечаю, что она есть в наличии даже при возникновении OutOfMemoryException. Так что мне кажется, что проблемы скорее в том, что просто превышается максимальный размер памяти, допустимый для процесса.
Начал копать в эту сторону. Наткнулся на кучу свойств у Process: WorkingSet64, PeakWorkingSet64, MaxWorkingSet и иже с ними. И что-то не могу в них разобраться.
Итак, как я понял из описания, WorkingSet64 должен возвращать текущий объём памяти в байтах, а MaxWorkingSet - задавать максимальный допустимый объём памяти (причём MaxWorkingSet имеет тип IntPtr...). Ну ладно, я создал тестовое приложение и смотрю на значения этих свойств для Process.GetCurrentProcess() (возвращённые значения делю на 1024, приводя к килобайтам):
  • WorkingSet64 возвращает 67 148 КБ
  • PeakWorkingSet64 возвращает 73 532 КБ (ну да, логично, это максимальный объём, когда-либо использовавшийся процессом)
  • а вот MaxWorkingSet возвращает 1 380 КБ!
  • при этом в диспетчере задач для процесса указан объём 35 656 КБ!
Видимо, я чего-то не понимаю. Почему MaxWorkingSet в несколько раз меньше текущего объёма памяти? Почему не совпадает значение в диспетчере задач и в WorkingSet64 ?
И если будут иные советы по разрешению ситуации, буду благодарен.
Если это важно, пишу под Framework 4.0 (чтобы была поддержка WinXP), ОС сейчас Windows 7 и 64-х битная машина, хотя OutOfMemory возникает в-основном на 32-битных компьютерах с Windows XP.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.02.2016, 17:33
Ответы с готовыми решениями:

Уменьшение используемого объёма памяти при работе с изображениями
Здравствуйте, вот сейчас я пытаюсь сделать простенькую игру. И вот я столкнулся со след. проблемой при отрисовке карты: Моя карта...

Найти изменение энтропии при расширении 8 г кислорода от объема V1=10л при t1=80 до объема V2=40л
Найти изменение энтропии при расширении 8 г кислорода от объема V1=10л при t1=80 до объема V2=40л при t2=30. Благодарна любой помощи

Изменение объёма памяти
Всем привет. Интересует такой вопрос. Можно ли поменять планку памяти (ОЗУ) в китайском планшете? Стоит 512МБ DDR3, и я видел на видео,...

6
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
13.02.2016, 21:42
вычищай свой говнокод и всё пройдет, гугли что такое IDisposable, зачем нужны Close и т.п
а эти глупости забудь смело, как и о существовании GC.Collect

Добавлено через 50 секунд
алгоритмы распределения памяти в ОС умней большинства программистов сталкивающихся с OutOfMemory
2
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 3
14.02.2016, 08:10  [ТС]
m0nax, Вы ещё про using и finally расскажите.
Хотя будет интересно услышать предложение, что мне сделать IDisposable, если в коде используются только списки, массивы, словари и COM-объекты Ворда. Может, дотнетовские библиотеки переписать?
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
14.02.2016, 10:26
Цитата Сообщение от pokibor Посмотреть сообщение
что мне сделать IDisposable,
Цитата Сообщение от pokibor Посмотреть сообщение
COM-объекты Ворда
COM объекты уничтожаются с помощью ReleaseComObject.
Такая же ситуация с Excel - нужно каждый объект релизить, и желательно(а мб и необходимо) в правильной последовательности.
http://stackoverflow.com/quest... op-objects

Цитата Сообщение от pokibor Посмотреть сообщение
только списки, массивы, словари
Обнуляйте ссылки - GC сам справится.
1
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 3
14.02.2016, 10:55  [ТС]
Woldemar89, спасибо!
Насчёт ReleaseComObject идея правильная, хотя не уверен, что это освободит сильно много памяти (всё же основную часть списки и массивы жрут). Что касается обнуления ссылок, то я всегда стараюсь вызвать .Clear для словарей и списков после использования, если Вы имели это в виду. Насчёт = null для массива посмотрю, но массивы вроде только в самом конце процесса используются.

Всё же хочется узнать, как лучше увеличить объём доступной памяти (дело в том, что чем больше её доступно - тем с более здоровыми документами можно работать).
Насколько я разобрался, MaxWorkingSet вызывать без толку, как и функции WinAPI - это только рекомендации. Поскольку Word - 32-х битный, то и add-in вызывается в 32-х битной среде и значит, ограничен 2 Гб адресного пространства. Немного не ясно, почему же тогда столько процесс в памяти не занимает, но скорее всего, тут используется какая-то виртуализация.
Понятно, что лучший способ - вынести часть кода в другой процесс. Но нельзя ли решить задачу как-то проще - через вызова кода в другом AppDomain, например?
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
14.02.2016, 11:01
pokibor, мне кажется, вы не туда копаете, подход неправильный.
Приведите пример, объясните как идет обработка. Что на входе, что на выходе.

Для справки:
docx и xlsx - переименуйте в zip. Откройте, и структуру посмотрите. Это обычные zip архивы.
Возможно, можно просто распаковать, да работать с xml? Или типа того...

Короче мне лень дальше ванговать - рассказывайте процесс подробно от и до на небольшом примере.
1
Эксперт .NET
 Аватар для Usaga
14127 / 9347 / 1350
Регистрация: 21.01.2016
Сообщений: 35,125
14.02.2016, 16:21
Цитата Сообщение от pokibor Посмотреть сообщение
всё же основную часть списки и массивы жрут
Звучит так, как будто вы выполнили профилирование и уже точно знаете, что и где у вас память жрёт. В таком случае непонятно, что тут обсуждается...

Я это к чему. Очень многое зависит от вашего кода и, как заметил Woldemar89, не зная что и как он делает, гадать о причинах можно долго. Но хочу заметить, что COM-объекты ворда очень толстозадые (как-никак работают с DOM документов). Поэтому старайтесь релизить эти объекты как можно раньше.

И IDisposable - это вам намёк на то, что время жизни многих объектов вашей программы можно (и нужно, раз такое дело) принудительно ограничить, что снизит затраты памяти...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.02.2016, 16:21
Помогаю со студенческими работами здесь

Изменение объёма ёмкости при увеличении температуры жидкости
Добрый день. Есть ёмкость в виде стеклянной трёх литровой банки которую мы заполняет водой при разной температуре. Я её смоделировал по...

Изменение объема жесткого диска после Акроника при восстановлении
Речь идет о странности восстановлении из архива образа системы, ранее созданным Акроником: Расширение (.tib) При создании сжатия я...

Исключение OutOfMemoryException на машине с 16 GB оперативной памяти
Доброго всем времени суток. Подскажите пожалуйста если кто то с этим сталкивался и знает решение проблемы. Проблема следующая. Писал...

Как бороться с увеличением объема потребляемой оперативной памяти при сохранении файла Excel без закрытия?
Привет Всем! Вопрос такой, в программе написанной на VBA Ecxel я заметил такую штуку, при каждом сохранении без закрытия файла в ДиспЗадач...

EF и OutOfMemoryException при выборке
При выборке 187кк объектов вылетает OutOfMemoryException, 16гб озу недостаточно, я так понимаю выход - обрабатывать частями, то есть делать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru