|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
Есть программа оперирующая большим числом объектов и структур (несколько миллионов). Такое количество объектов оправдано - там модель энергосистемы состоящей из тысяч подстанций вместе с их оборудованием, графическим представлением, топологией, состоянием, режимом. Модель в памяти занимает порядка гигабайта (там показывают диспетчер задачи и Process Explorer ). Кроме того, может быть обращение к временным объектам через интерфейсы типа TInterfacedObject, которые удаляются при выходе из области видимости. Используюся парсеры XML (DIXML), объемы файлов данных несколько десятков мегабайт, на время чтения и построения XML DOM объем памяти может возрастать на пару сотен метров, но потом уменьшается. Нужно сократить объем занимаемой памяти. Для этого понять, какие объекты или структуры заминают существенную часть и постепенно оптимизировать. Для этого написал модуль, который бегает по всем объектам и собирает статистику использования памяти по классам по RTII через SizeOf , с учетом размеров динамических массивов и строк (они прибавляются). Вот результат работы. https://disk.yandex.ru/d/bY5hSPlnn3DTLA Еще пользовался программой Deleaker, на относительно малых объемах (200-300 Мб) она показывала сопоставимые с моим модулем результаты. Ну а на объемах в гигабайт она просто дохнет. Но модуль показывает не то, что диспетчер задач. Тут 150 Мб, в диспетчере 1,2 Гб. Нужно понять чем забита программа. То, что диспетчер задач показывает "не то" я в курсе. За учечками памяти следим, FastMM показывает на выходе не более нескольких десятков неосвобожденных объектов, но не миллионы. Хотелось бы как то посмотреть чем физически занята куча. какого класса объекты (классы, рекорды, динамические массивы, строки, битмапы) где расположены, живые ли. Есть идеи как? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 21:15 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
swame2, Нужно учесть что даже пустой объект занимает определенный объем, что критично когда их миллионы. Плюс менеджер памяти на каждый выделенный блок тоже хранит определенную инфррмацию. Лучший выход - кастомное управление памятью для наиболее массовых классов. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 21:20 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
asviridenkov, Знаю, были оптимизированы порядка пяти самых массовых классов, которые были переделаны на более компактные рекорды, уменьшено количество использованных экземпляров, память уменьшена на 30-40%. НА все рефакторинги, связанные с этим было потрачено порядка человеко - года. И есть планы дальнейшей оптимизации. Это потребует огромной работы, существенной переделки объектных моделей, несколько человеко-лет. НО те классы отображались в моем отчете. А тут теперь непонятно, что вообще жрет память. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 21:44 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
swame2, Тут нужно учесть, что сам по себе переход на рекорды не решит проблему, если каждая record выделяется динамически. В плане мониторинга, дает отчет AQTime, но он платный. И на миллионах я его не гонял. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 21:54 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
swame2Есть идеи как? FastMM идёт в исходниках, дотянуться до его объектов несложно. Вроде бы на это даже есть штатные функции. Смотри список блоков и их расположение. Но объёмы лога будут громадны, копаться придётся долго. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2021, 23:17 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
swame2 Но модуль показывает не то, что диспетчер задач. Тут 150 Мб, в диспетчере 1,2 Гб. Нужно понять чем забита программа. Если ничего не попутал, то это означает, что бОльшую часть памяти жрёт не твой код, и, следовательно, искать объекты в дельфёвом коде - бесполезно. Искать надо внешние по отношению к твоему коду ресурсы. Т.е. описатели разного толка. Всякие растры, XML и так далее. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2021, 23:10 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
А ради чего эта оптимизация? Для интереса сейчас открыл диспетчер задач, огнелис откушал 500Мб за будь здоров. Хотя открыто всего несколько тем с sql.ru. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2021, 10:22 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
Поставить FastMM полноценный из репо, а не комплектный, у него есть методы запроса всей текущей кучи. Или как минимум можно запросить общий выделенный объем и сравнить его с показаниями диспетчера. Надо помнить, что FastMM в режиме полной отладки ест намного больше памяти на отладочные структуры. Также неплохо совсем избавиться от утечек при закрытии. Также утечки могут и не ловиться, если они при закрытии удаляются, но в процессе работы тем или иным образом теряются. Это самый сложный случай. А вариант "прописать в обязательных требованиях наличие 2Гб памяти" не предлагать? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2021, 10:26 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal, asviridenkov Тут нужно учесть, что сам по себе переход на рекорды не решит проблему, если каждая record выделяется динамически. В плане мониторинга, дает отчет AQTime, но он платный. И на миллионах я его не гонял. Поставил AQTime из магазина, вообще не пашет. ТО говорит нет exe, то нет debug информации. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2021, 10:57 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
GunSmoker swame2 Но модуль показывает не то, что диспетчер задач. Тут 150 Мб, в диспетчере 1,2 Гб. Нужно понять чем забита программа. Если ничего не попутал, то это означает, что бОльшую часть памяти жрёт не твой код, и, следовательно, искать объекты в дельфёвом коде - бесполезно. Искать надо внешние по отношению к твоему коду ресурсы. Т.е. описатели разного толка. Всякие растры, XML и так далее. Про это и был вопрос. Как мониторить подобные ресурсы в куче. Растры там есть, но не так много, XML освобождается после чтения, это видно по диспетчеру. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2021, 10:59 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
[quot Fr0sT-Brutal#22414818]Поставить FastMM полноценный из репо, а не комплектный, у него есть методы запроса всей текущей кучи. Или как минимум можно запросить общий выделенный объем и сравнить его с показаниями диспетчера. Надо помнить, что FastMM Fr0sT-Brutal в режиме полной отладки ест намного больше памяти на отладочные структуры. Отдельный полный FastMM конечно стоит, но только штатными отчетами пользовался, в API не разбирался. Несколько дней или недель сейчас тратить некогда. Fr0sT-Brutal Также неплохо совсем избавиться от утечек при закрытии. Совсем не получится, так несколько утечек встроено в дельфи и сторонние компоненты типа девэкспресса. Наших сравнимое с ними количество. Fr0sT-Brutal Также утечки могут и не ловиться, если они при закрытии удаляются, но в процессе работы тем или иным образом теряются. Это самый сложный случай. Вопрос и был как мониторить такие расходы, может это даже и не выделения памяти, а какая то фрагментация. Fr0sT-Brutal А вариант "прописать в обязательных требованиях наличие 2Гб памяти" не предлагать? Такое требование есть по факту, но тут гигабайт жрет 1 документ, а нужно держать их несколько одновременно открытыми в одном 32 разрядном процессе, на процесс отведено 3 Гб. Можно попробовать и 64 разрядное приложение, но если так разбрасываться памятью, то надо будет требовать по 32 или 64. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2021, 11:11 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
Exteris А ради чего эта оптимизация? Для интереса сейчас открыл диспетчер задач, огнелис откушал 500Мб за будь здоров. Хотя открыто всего несколько тем с sql.ru. Нужно держать одновременно открытыми несколько больших документов, или документ динамически Собранный из многих маленьких. Были эксперименты держать каждый документ в своем процессе, как вкладки в браузере, но архитектурно это намного, намного сложнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2021, 11:15 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
swame2, еще раз: у FastMM есть пара публичных функций для запроса состояния кучи. Вот их и ковыряй. Там и просто счетчики, и полные дампы. А утечки всё же стоит минимизировать. Если их не избежать (хотя это явно баг, который надо репортить), то у FastMM есть механизм ожидаемых утечек, которые он не будет выдавать в отчет. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2021, 11:25 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
swame2 Fr0sT-Brutal, Поставил AQTime из магазина, вообще не паше. ТО говорит нет exe, то нет debug информации. Программа должна быть собрана в Win32 и с полной отладочной информацией. Что значит "нет exe" вообще непонятно. Там же его руками выбираешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2021, 13:41 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
swame2 GunSmoker пропущено... Если ничего не попутал, то это означает, что бОльшую часть памяти жрёт не твой код, и, следовательно, искать объекты в дельфёвом коде - бесполезно. Искать надо внешние по отношению к твоему коду ресурсы. Т.е. описатели разного толка. Всякие растры, XML и так далее. Про это и был вопрос. Как мониторить подобные ресурсы в куче. Растры там есть, но не так много, XML освобождается после чтения, это видно по диспетчеру. Пробуй завести AQTime или Deleaker. А так, для бедных - Process Explorer-ом можно проверить число хэндлов и GDI, VMMap-м можно глянуть, что дело ли в куче, по коду расставить GetProcessMemoryInfo, чтобы наблюдать поведение памяти после вызова различных функций, логгировать всё вусмерть. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2021, 15:16 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
swame2 Поставил AQTime из магазина, вообще не пашет. ТО говорит нет exe, то нет debug информации. Там с галками TD32 debug info надо поиграться. Попробуй standalone включить/выключить. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2021, 15:18 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
swame2, Несколько дней или недель сейчас тратить некогда. НА все рефакторинги, связанные с этим было потрачено порядка человеко - года. И есть планы дальнейшей оптимизации. Это потребует огромной работы, существенной переделки объектных моделей, несколько человеко-лет. Можно попробовать и 64 разрядное приложение, но если так разбрасываться памятью, то надо будет требовать по 32 или 64. Крестик снимай и требуй, хоть облако, а хоть ... Человеко-год тебе же кто-то проспонсировал. А так сразу будут видеть - крутой прогер - на байтики не разменивается )) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2021, 20:01 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
Постарайся уйти от миллионов классов к массивам рекордов. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2021, 20:45 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
rgreat> Постарайся уйти от миллионов классов к массивам рекордов. У него в коде проекта каша с использованием инструментов, а ты ему предлагаешь ещё пару человеко-лет на перекраску с жёлтого на зелёный потратить... Не в бобине дело. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2021, 22:00 |
|
Посмотреть на что расходуется память
|
|||
---|---|---|---|
#18+
Значит остаётся стандартный выход: объявить это "High Load" и закидывать железом помощнее. Заодно можно по конференциям покататься за чужой счёт. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2021, 22:13 |
|
|
start [/forum/topic.php?fid=58&msg=40123730&tid=2036748]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 269ms |
total: | 408ms |
0 / 0 |