powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Посмотреть на что расходуется память
21 сообщений из 21, страница 1 из 1
Посмотреть на что расходуется память
    #40122879
swame2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть программа оперирующая большим числом объектов и структур (несколько миллионов).
Такое количество объектов оправдано - там модель энергосистемы состоящей из тысяч подстанций вместе с их оборудованием, графическим представлением, топологией, состоянием, режимом. Модель в памяти занимает порядка гигабайта (там показывают диспетчер задачи и Process Explorer ). Кроме того, может быть обращение к временным объектам через интерфейсы типа TInterfacedObject, которые удаляются при выходе из области видимости.
Используюся парсеры XML (DIXML), объемы файлов данных несколько десятков мегабайт, на время чтения и построения XML DOM объем памяти может возрастать на пару сотен метров, но потом уменьшается.

Нужно сократить объем занимаемой памяти. Для этого понять, какие объекты или структуры заминают существенную часть и постепенно оптимизировать.
Для этого написал модуль, который бегает по всем объектам и собирает статистику использования памяти по классам по RTII через SizeOf , с учетом размеров динамических массивов и строк (они прибавляются). Вот результат работы.
https://disk.yandex.ru/d/bY5hSPlnn3DTLA
Еще пользовался программой Deleaker, на относительно малых объемах (200-300 Мб) она показывала сопоставимые с моим модулем результаты. Ну а на объемах в гигабайт она просто дохнет.
Но модуль показывает не то, что диспетчер задач. Тут 150 Мб, в диспетчере 1,2 Гб. Нужно понять чем забита программа. То, что диспетчер задач показывает "не то" я в курсе.
За учечками памяти следим, FastMM показывает на выходе не более нескольких десятков неосвобожденных объектов, но не миллионы.
Хотелось бы как то посмотреть чем физически занята куча. какого класса объекты (классы, рекорды, динамические массивы, строки, битмапы) где расположены, живые ли. Есть идеи как?
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40122880
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swame2,

Нужно учесть что даже пустой объект занимает определенный объем, что критично когда их миллионы. Плюс менеджер памяти на каждый выделенный блок тоже хранит определенную инфррмацию.
Лучший выход - кастомное управление памятью для наиболее массовых классов.
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40122887
swame2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
asviridenkov,

Знаю, были оптимизированы порядка пяти самых массовых классов, которые были переделаны на более компактные рекорды, уменьшено количество использованных экземпляров, память уменьшена на 30-40%. НА все рефакторинги, связанные с этим было потрачено порядка человеко - года. И есть планы дальнейшей оптимизации. Это потребует огромной работы, существенной переделки объектных моделей, несколько человеко-лет. НО те классы отображались в моем отчете. А тут теперь непонятно, что вообще жрет память.
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40122892
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swame2,

Тут нужно учесть, что сам по себе переход на рекорды не решит проблему, если каждая record выделяется динамически.

В плане мониторинга, дает отчет AQTime, но он платный. И на миллионах я его не гонял.
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40122907
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swame2Есть идеи как?

FastMM идёт в исходниках, дотянуться до его объектов несложно. Вроде бы на это
даже есть штатные функции. Смотри список блоков и их расположение. Но объёмы
лога будут громадны, копаться придётся долго.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123067
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swame2
Но модуль показывает не то, что диспетчер задач. Тут 150 Мб, в диспетчере 1,2 Гб. Нужно понять чем забита программа.

Если ничего не попутал, то это означает, что бОльшую часть памяти жрёт не твой код, и, следовательно, искать объекты в дельфёвом коде - бесполезно.

Искать надо внешние по отношению к твоему коду ресурсы. Т.е. описатели разного толка. Всякие растры, XML и так далее.
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123302
Фотография Exteris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ради чего эта оптимизация?
Для интереса сейчас открыл диспетчер задач, огнелис откушал 500Мб за будь здоров. Хотя открыто всего несколько тем с sql.ru.
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123303
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поставить FastMM полноценный из репо, а не комплектный, у него есть методы запроса всей текущей кучи. Или как минимум можно запросить общий выделенный объем и сравнить его с показаниями диспетчера. Надо помнить, что FastMM в режиме полной отладки ест намного больше памяти на отладочные структуры.
Также неплохо совсем избавиться от утечек при закрытии.
Также утечки могут и не ловиться, если они при закрытии удаляются, но в процессе работы тем или иным образом теряются. Это самый сложный случай.

А вариант "прописать в обязательных требованиях наличие 2Гб памяти" не предлагать?
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123545
swame2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fr0sT-Brutal,

asviridenkov

Тут нужно учесть, что сам по себе переход на рекорды не решит проблему, если каждая record выделяется динамически.
В плане мониторинга, дает отчет AQTime, но он платный. И на миллионах я его не гонял.


Поставил AQTime из магазина, вообще не пашет. ТО говорит нет exe, то нет debug информации.
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123547
swame2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GunSmoker
swame2
Но модуль показывает не то, что диспетчер задач. Тут 150 Мб, в диспетчере 1,2 Гб. Нужно понять чем забита программа.

Если ничего не попутал, то это означает, что бОльшую часть памяти жрёт не твой код, и, следовательно, искать объекты в дельфёвом коде - бесполезно.

Искать надо внешние по отношению к твоему коду ресурсы. Т.е. описатели разного толка. Всякие растры, XML и так далее.


Про это и был вопрос. Как мониторить подобные ресурсы в куче. Растры там есть, но не так много, XML освобождается после чтения, это видно по диспетчеру.
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123550
swame2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Fr0sT-Brutal#22414818]Поставить FastMM полноценный из репо, а не комплектный, у него есть методы запроса всей текущей кучи. Или как минимум можно запросить общий выделенный объем и сравнить его с показаниями диспетчера. Надо помнить, что FastMM
Fr0sT-Brutal
в режиме полной отладки ест намного больше памяти на отладочные структуры.

Отдельный полный FastMM конечно стоит, но только штатными отчетами пользовался, в API не разбирался. Несколько дней или недель сейчас тратить некогда.

Fr0sT-Brutal
Также неплохо совсем избавиться от утечек при закрытии.

Совсем не получится, так несколько утечек встроено в дельфи и сторонние компоненты типа девэкспресса.
Наших сравнимое с ними количество.

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

Вопрос и был как мониторить такие расходы, может это даже и не выделения памяти, а какая то фрагментация.

Fr0sT-Brutal
А вариант "прописать в обязательных требованиях наличие 2Гб памяти" не предлагать?


Такое требование есть по факту, но тут гигабайт жрет 1 документ, а нужно держать их несколько одновременно открытыми в одном 32 разрядном процессе, на процесс отведено 3 Гб. Можно попробовать и 64 разрядное приложение, но если так разбрасываться памятью, то надо будет требовать по 32 или 64.
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123553
swame2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Exteris
А ради чего эта оптимизация?
Для интереса сейчас открыл диспетчер задач, огнелис откушал 500Мб за будь здоров. Хотя открыто всего несколько тем с sql.ru.


Нужно держать одновременно открытыми несколько больших документов, или документ динамически Собранный из многих маленьких.
Были эксперименты держать каждый документ в своем процессе, как вкладки в браузере, но архитектурно это намного, намного сложнее.
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123557
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
swame2,

еще раз: у FastMM есть пара публичных функций для запроса состояния кучи. Вот их и ковыряй. Там и просто счетчики, и полные дампы.
А утечки всё же стоит минимизировать. Если их не избежать (хотя это явно баг, который надо репортить), то у FastMM есть механизм ожидаемых утечек, которые он не будет выдавать в отчет.
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123605
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swame2
Fr0sT-Brutal,

Поставил AQTime из магазина, вообще не паше. ТО говорит нет exe, то нет debug информации.


Программа должна быть собрана в Win32 и с полной отладочной информацией.
Что значит "нет exe" вообще непонятно. Там же его руками выбираешь.
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123637
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swame2
GunSmoker
пропущено...

Если ничего не попутал, то это означает, что бОльшую часть памяти жрёт не твой код, и, следовательно, искать объекты в дельфёвом коде - бесполезно.

Искать надо внешние по отношению к твоему коду ресурсы. Т.е. описатели разного толка. Всякие растры, XML и так далее.


Про это и был вопрос. Как мониторить подобные ресурсы в куче. Растры там есть, но не так много, XML освобождается после чтения, это видно по диспетчеру.


Пробуй завести AQTime или Deleaker.

А так, для бедных - Process Explorer-ом можно проверить число хэндлов и GDI, VMMap-м можно глянуть, что дело ли в куче, по коду расставить GetProcessMemoryInfo, чтобы наблюдать поведение памяти после вызова различных функций, логгировать всё вусмерть.
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123638
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swame2
Поставил AQTime из магазина, вообще не пашет. ТО говорит нет exe, то нет debug информации.


Там с галками TD32 debug info надо поиграться. Попробуй standalone включить/выключить.
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123709
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swame2,
Несколько дней или недель сейчас тратить некогда.

НА все рефакторинги, связанные с этим было потрачено порядка человеко - года.
И есть планы дальнейшей оптимизации. Это потребует огромной работы,
существенной переделки объектных моделей, несколько человеко-лет.

Можно попробовать и 64 разрядное приложение, но если так разбрасываться памятью,
то надо будет требовать по 32 или 64.

Крестик снимай и требуй, хоть облако, а хоть ...
Человеко-год тебе же кто-то проспонсировал.

А так сразу будут видеть - крутой прогер - на байтики не разменивается ))
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123717
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Постарайся уйти от миллионов классов к массивам рекордов.
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123730
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat> Постарайся уйти от миллионов классов к массивам рекордов.


У него в коде проекта каша с использованием инструментов,
а ты ему предлагаешь ещё пару человеко-лет на перекраску с
жёлтого на зелёный потратить...

Не в бобине дело.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123738
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит остаётся стандартный выход: объявить это "High Load" и закидывать железом
помощнее. Заодно можно по конференциям покататься за чужой счёт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Посмотреть на что расходуется память
    #40123740
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

Было бы желание. Может ему уже заняться нечем и скучно.
И начальство от того нервничает.

А так "человек работает".
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Посмотреть на что расходуется память
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]