cProfile занимает много памяти - PullRequest
1 голос
/ 11 марта 2011

Я пытаюсь профилировать свой проект на python, но у меня не хватает памяти.

Мой проект сам по себе довольно интенсивно использует память, но даже запуски половинного размера умирают с "MemoryError" при запуске под cProfile.

Выполнение меньших прогонов не является хорошим вариантом, потому что мы подозреваем, что время прогона масштабируется суперлинейно, и мы пытаемся выяснить, какие функции доминируют при больших прогонах.

Почему cProfile занимает так много памяти?Могу ли я сделать это займет меньше?Это нормально?

1 Ответ

1 голос
/ 11 марта 2011

Обновлено : поскольку cProfile встроен в текущие версии Python (расширение _lsprof), он должен использовать основной распределитель. Если это не работает для вас, Python 2.7.1 имеет опцию компилятора --with-valgrind, которая заставляет его переключиться на использование malloc() во время выполнения. Это хорошо, так как избегает необходимости использовать файл подавлений. Вы можете создать версию только для профилирования, а затем запустить приложение Python под valgrind, чтобы просмотреть все выделения, сделанные профилировщиком, а также любые расширения C, использующие пользовательские схемы размещения.

(Остальная часть оригинального ответа следует):

Может быть, попытаться увидеть, куда идут ассигнования. Если в вашем коде есть место, где вы можете периодически выгружать использование памяти, вы можете использовать guppy для просмотра распределений:

import lxml.html
from guppy import hpy

hp = hpy()
trees = {}
for i in range(10):
    # do something
    trees[i] = lxml.html.fromstring("<html>")
    print hp.heap()

    # examine allocations for specific objects you suspect
    print hp.iso(*trees.values())
...