Я хотел бы знать, сколько памяти потребляет данная структура данных. Поэтому предположим, что у меня есть параллельный связанный список. Я хотел бы знать, насколько велик список. У меня есть несколько вариантов: malloc_hooks
, который я не думаю, является потокобезопасным, и getrusage
's ru_maxrss
, но я действительно не знаю, что это дает мне (сколько памяти весь процесс потребляет во время его выполнения?). Я хотел бы знать, действительно ли кто-то измерял потребление памяти таким образом. Есть ли инструмент для этого? Как massif
тариф?Потребление памяти параллельной структуры данных в C
ответ
Чтобы понять, сколько байтов на самом деле стоит malloc
, некоторые структуры, например узел связанного списка, создают изолированный тестовый пример (не параллельный!), Который выделяет тысячи из них, и просматривает значения дельта в использование памяти программы. Существуют различные способы сделать это. Если ваша библиотека имеет структуру mallinfo
, такую как библиотека GNU C, найденная в системах GNU/Linux, вы можете просмотреть статистику до и после. Другой способ - проследить системные вызовы программы, чтобы посмотреть ее схему выделения из ОС. Если, скажем, мы выделяем 10 000 000 узлов списка, а программа выполняет вызов sbrk()
около 39 000 раз, увеличивая размер процесса на 8192 байта в каждом вызове, то это означает, что узел списка занимает 32 байта, накладные расходы и все.
Помня о том, что выделение тысяч объектов одного размера в одном потоке не реально отражает фактическое использование памяти в реалистичной программе, которая включает фрагментацию.
Если вы хотите выделить небольшие структуры и приблизиться к тому, чтобы не тратить впустую байта (или не вызывать никаких отходов, о которых вы не знаете и не контролируете), а также для управления фрагментацией, выделите большие массивы объектов из malloc
. (или ваш системный распределитель выбора) и разбейте их самостоятельно. В malloc
все еще неизвестны накладные расходы, но он разделен на большое количество объектов, что делает его незначительным.
Или, как правило, напишите свой собственный распределитель, чье поведение и накладные расходы вы понимаете подробно, и который сам берет большие куски из системы.
Концептуально говоря вам нужно знать количество предметов, с которыми вы работаете. Затем вам нужно знать размер каждого другого типа данных, используемого в вашей структуре данных. Вы также должны будете учитывать размер указателей или что-то, что несколько использует какую-то память.
Тогда вы можете придумать формулу, которая выглядит следующим:
Потребление = N * (SizeOf (типы данных)).
Другими словами, вы хотите, чтобы вы добавляли какой-либо тип данных вместе (размер типа данных) и умножали его на количество элементов.
- 1. Потребление памяти объектов C++
- 2. Код структуры Entity Framework Первое потребление и потребление памяти
- 3. Потребление памяти большого набора данных
- 4. Приложение C#, потребление памяти монитора
- 5. Потребление памяти памяти Java
- 6. Чтение данных структуры из памяти в C?
- 7. Потребление памяти?
- 8. Потребление памяти в Cherrypy
- 9. iOS: потребление памяти для распределения типа данных
- 10. Как рассчитать потребление памяти в C
- 11. Потребление памяти параллельного потока Scala
- 12. Потребление в памяти
- 13. Потребление памяти в Racket
- 14. Потребление памяти в Magick.NET
- 15. Освобождение памяти структуры в C
- 16. Потребление памяти по printf()
- 17. Огромное потребление памяти DataTable
- 18. Типичное потребление памяти CppCMS
- 19. Python и потребление памяти
- 20. Потребление памяти API
- 21. posix потребление памяти нити
- 22. Потребление памяти wpfgfx_v0400.dll
- 23. Потребление памяти KDB/Q
- 24. избежать расточительное потребление памяти
- 25. Структуры C, распределение и структуры памяти
- 26. Как уменьшить потребление памяти?
- 27. распределение памяти структуры в C++
- 28. Распределение памяти структуры в C
- 29. Огромное потребление памяти UniversalImageLoader
- 30. Высокое потребление памяти изображения
Кто-нибудь знает о http://man7.org/linux/man-pages/man3/mallinfo.3.html? –