Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Посмотреть на что расходуется память / 21 сообщений из 21, страница 1 из 1
24.12.2021, 21:15
    #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
24.12.2021, 21:20
    #40122880
asviridenkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посмотреть на что расходуется память
swame2,

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

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

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

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

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

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

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

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

asviridenkov

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


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

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

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


Про это и был вопрос. Как мониторить подобные ресурсы в куче. Растры там есть, но не так много, XML освобождается после чтения, это видно по диспетчеру.
...
Рейтинг: 0 / 0
28.12.2021, 11:11
    #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
28.12.2021, 11:15
    #40123553
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посмотреть на что расходуется память
Exteris
А ради чего эта оптимизация?
Для интереса сейчас открыл диспетчер задач, огнелис откушал 500Мб за будь здоров. Хотя открыто всего несколько тем с sql.ru.


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

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

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


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

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

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


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


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

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


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

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

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

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

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


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

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

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

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


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