Valgrind на Python2.4: «возможно, потеряно огромное количество памяти» - PullRequest
2 голосов
/ 19 апреля 2011

Я написал код, который работает без ошибок. Код использует MySQLdb для (частого) доступа к базе данных и использует 4 разные базы данных. Также генерируется пара файлов журнала и используется модуль регистрации. Реальное беспокойство заключается в том, что при запуске Valgrind я получаю следующее

==7840== LEAK SUMMARY:
==7840==    definitely lost: 29 bytes in 1 blocks
==7840==    indirectly lost: 0 bytes in 0 blocks
==7840==      possibly lost: 1,104,793 bytes in 8,865 blocks
==7840==    still reachable: 70,684 bytes in 2,194 blocks
==7840==         suppressed: 0 bytes in 0 blocks

Самая большая утечка

==7840== 393,216 bytes in 1 blocks are possibly lost in loss record 1,585 of 1,585
==7840==    at 0x4005903: malloc (vg_replace_malloc.c:195)
==7840==    by 0x204929E: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x2054833: PyString_InternInPlace (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x20A0362: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x209FB15: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x20A0075: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x209FB15: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x20A0068: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x20A04CC: PyMarshal_ReadObjectFromString (in /usr/lib /libpython2.4.so.1.0)
==7840==    by 0x20A1D20: PyMarshal_ReadLastObjectFromFile (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x209AA63: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x209CB7E: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x209D9B2: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x209DE71: ??? (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x209E087: PyImport_ImportModuleEx (in /usr/lib/libpython2.4.so.1.0)
==7840==    by 0x207DB2D: ??? (in /usr/lib/libpython2.4.so.1.0)

Итак, вы видите, он показывает почти 1 МБ памяти как возможно потерянную. Есть ли какая-то реальная проблема с моим кодом, или это использование MySQLdb, который дает такое поведение. Кроме того, чтобы минимизировать это, я должен явно освободить объекты (в том числе файл, соединения с базой данных) или есть модуль Python, на который я мог бы посмотреть?

1 Ответ

5 голосов
/ 19 апреля 2011

Python использует собственный распределитель памяти поверх malloc, что вызывает проблемы при использовании valgrind.См. Разное / README.valgrind для подробного объяснения.Предполагая, что вы не собираетесь перестраивать Python, решение состоит в том, чтобы использовать Misc / valgrind-python.supp в качестве файла подавления и раскомментировать строки в нем, которые подавляют предупреждения для PyObject_Free и PyObject_Realloc. * 1008.*

...