I recently had need of tracing numpy data allocation/deallocation. I was unable to find a simple way to do so, and so ended up putting the code below into ndarraytypes.h to allow me to trace allocations. A key part is that this jumps back into python, so I can inspect the stack and find out where in the upper level code large allocations are occurring.
I wondered, however, if there were a better way to accomplish the same goal, preferably in pure python. Ray Jones static void *numpy_memtrace_malloc(size_t size) { void *result = malloc(size); PyObject *npy = PyImport_ImportModule("numpy"); if (npy != NULL) { if (PyObject_HasAttrString(npy, "tracemalloc")) { PyObject *ret; ret = PyObject_CallMethod(npy, "tracemalloc", "Nl", PyLong_FromVoidPtr(result), (long) size); Py_XDECREF(ret); Py_DECREF(npy); PyErr_Clear(); } } return result; } static void numpy_memtrace_free(void *ptr) { free(ptr); PyObject *npy = PyImport_ImportModule("numpy"); if (npy != NULL) { if (PyObject_HasAttrString(npy, "tracefree")) { PyObject *ret; ret = PyObject_CallMethod(npy, "tracefree", "N", PyLong_FromVoidPtr(ptr)); Py_XDECREF(ret); Py_DECREF(npy); PyErr_Clear(); } } } static void *numpy_memtrace_realloc(void *ptr, size_t size) { void *result = realloc(ptr, size); PyObject *npy = PyImport_ImportModule("numpy"); if (npy != NULL) { if (PyObject_HasAttrString(npy, "npyealloc")) { PyObject *ret; ret = PyObject_CallMethod(npy, "npyealloc", "NNl", PyLong_FromVoidPtr(ptr), PyLong_FromVoidPtr(result), size); Py_XDECREF(ret); Py_DECREF(npy); PyErr_Clear(); } } return result; } /* Data buffer */ #define PyDataMem_NEW(size) ((char *)numpy_memtrace_malloc(size)) #define PyDataMem_FREE(ptr) numpy_memtrace_free(ptr) #define PyDataMem_RENEW(ptr,size) ((char *)numpy_memtrace_realloc(ptr,size)) _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion