14
Автор: Дмитрий Новожилов Руководитель: Сергей Лебедев 1/14

Tracemalloc in memory_profiler. Презентация участников

Embed Size (px)

Citation preview

Автор: Дмитрий Новожилов

Руководитель: Сергей Лебедев

1/14

@profile

def my_func(): a = [1] * (10 ** 6) b = [2] * (2 * 10 ** 7) del b return a

if __name__ == '__main__': my_func()

2/14

$ python -m memory_profiler example.py

3/14

Line # Mem usage Increment Line Contents

=====================================

3 @profile

4 5.97 MB 0.00 MB def my_func():

5 13.61 MB 7.64 MB a = [1] * (10 ** 6)

6 166.20 MB 152.59 MB b = [2] * (2 * 10 ** 7)

7 13.61 MB -152.59 MB del b

8 13.61 MB 0.00 MB return a

4/14

Часто работает не очень точно

Не отслеживает малые аллокации

Зависит от пакета psutil или операционной системы(posix)

Не всегда корректно обрабатывает освобождение памяти

5/14

Добавить в memory_profiler поддержку модуля tracemalloc

6/14

Отслеживает аллокации Python объектов на уровне интерпретатора

Добавлен в Python 3.4 (PEP 454)

7/14

Реализована возможность выбора инструмента для отслеживания изменений памяти: psutil, tracemalloc или средствами posix

$ python -m memory_profiler

--backend=tracemalloc example.py

8/14

Тестовая функция:

def mem_prof(n): a = bytearray(n) del a

9 /14

n=10^3, inc=0.000 MiB, dec=-0.000 MiB, size=0.001 MiB

n=10^4, inc=0.000 MiB, dec=-0.000 MiB, size=0.010 MiB

n=10^5, inc=0.102 MiB, dec=-0.000 MiB, size=0.095 MiB

n=10^6, inc=0.863 MiB, dec=0.949 MiB, size=0.954 MiB

n=10^7, inc=9.559 MiB, dec=9.559 MiB, size=9.537 MiB

n=10^8, inc=95.559 MiB, dec=95.559 MiB, size=95.367 MiB

10 /14

n=10^3, inc=0.001 MiB, dec=0.001 MiB, size=0.001 MiB

n=10^4, inc=0.010 MiB, dec=0.010 MiB, size=0.010 MiB

n=10^5, inc=0.095 MiB, dec=0.095 MiB, size=0.095 MiB

n=10^6, inc=0.954 MiB, dec=0.954 MiB, size=0.954 MiB

n=10^7, inc=9.537 MiB, dec=9.537 MiB, size=9.537 MiB

n=10^8, inc=95.367 MiB, dec=95.367 MiB, size=95.367 MiB

11 /14

12 /14

Не отслеживаются выделения памяти в пакетах, которые не используют API аллокаторов, добавленное в PEP 454 (например, tracemalloc не видит NumPy массивы)

Долго работает, если мест, где выделяется память много (время работы ~ кол-во инструкций байт-кода * кол-во аллокаций)

13 /14

https://github.com/fabianp/memory_profiler

https://github.com/demiurg906/memory_profiler

14 /14