Hello Tony,

 

Thanks a lot for your answer! I actually just got directly the “Python.Runtime.dll”  from the download link in sourceforge: http://sourceforge.net/projects/pythonnet/files/. But from the description I see that the last update of that one was done in 2013. Would there be a newer version somewhere else that I could get?  Perhaps this version I’m using is out of date and you have a newer one. Let me know if that’s the case.

 

I tried your suggestion of putting the “using” statement for the tuple objects, and also for “myTuple”, and the memory is still increasing a lot. I’ve made a memory profile to see which objects are being retained and after I ran that statement 5 thousand times I got this:


Imagem inline 1


As you can see more that 12 thousand instances of “PyInt” and more than 6 thousand of “PyObject” are created . Apparently it is creating these “PyInt” and “PyObjects” somewhere inside the “AsManagedObject”, because I don’t have PyInt objects anywhere in my code and this just happens when I call “AsManagedObject”.

 

Let me know if there is a newer version that could probably have that problem fixed which I am not aware of.


I appreciate a lot your help!

 

Best regards,

Eliana


2016-01-17 6:05 GMT-06:00 Tony Roberts <tony@pyxll.com>:
Hi Eliana,

which version of pythonnet are you using? when you say you're using the latest are you building it yourself from the develop branch on github?

I had a quick look at the code that converts from a python object to a double, and I don't see any obvious memory leaks there. Perhaps the leak is the objects resulting from indexing into the tuple are never getting disposed? Try something like this instead and see if it helps (and report back as it may help improve the code if we know exactly what the problem is).

PyTuple myTuple = PyTuple.AsTuple(result);

double result0;
using (var item0 = myTuple[0])
    result0 = (double)item0.AsManagedObject(typeof(double));

double result1;
using (var item1 = myTuple[1])
    result1 = (double)item1.AsManagedObject(typeof(double));

myTuple.Dispose();

I would also use a using statement for the myTuple as well, just to be sure dispose is called in the case an exception is thrown somewhere.

Regards,
Tony


On Fri, Jan 15, 2016 at 8:06 PM Eliana Mendes <eliana.mendesp@gmail.com> wrote:

Hello experts,

 

I'm having a memory leak problem when using the function AsManagedObject(typeof(double)). Basically I have something like this: 

 

PyTuple myTuple = PyTuple.AsTuple(result);

double result0 = (double)myTuple[0].AsManagedObject(typeof(double));

double result1 = (double)myTuple[1].AsManagedObject(typeof(double));

myTuple.Dispose();

 

where "result" is just a PyObject that returned from a python function. I simplified the code above just so you can understand better, but the thing is that the line that calls "AsManagedObject”  is executed thousands of times and it is increasing significantly the memory heap (it goes over 3 GB of memory in my scenario and it’s not released after execution). If I don't call just this specific function the memory remains stable. But I don’t know any other way to convert the PyObject to "double" unless using the “AsManagedObject” function.

It sounds to me that some objects are allocated inside the "AsManagedObject" method and they are not being released. Maybe it’s a bug there. Any ideas? I'm using latest version of python for .NET.

 

Thank you!


Eliana Mendes

Software Engineer


_________________________________________________
Python.NET mailing list - PythonDotNet@python.org
https://mail.python.org/mailman/listinfo/pythondotnet

_________________________________________________
Python.NET mailing list - PythonDotNet@python.org
https://mail.python.org/mailman/listinfo/pythondotnet