[vtkusers] release memory allocated in vtk from python

José M. Rodriguez Bacallao jmrbcu at gmail.com
Tue Jul 3 09:26:15 EDT 2012


it's much clearer now, thanks David!!!

On Mon, Jul 2, 2012 at 4:58 PM, David Gobbi <david.gobbi at gmail.com> wrote:
> That's correct.  ShallowCopy() will not increment the reference
> count of the reader.  It will only increment the reference counts
> of the arrays in the reader's output. It also copies information like
> the Origin and Spacing.
>
> CopyStructure() will copy even less: it only copies the information,
> not the arrays.
>
>  - David
>
> On Mon, Jul 2, 2012 at 2:16 PM, José M. Rodriguez Bacallao
> <jmrbcu at gmail.com> wrote:
>> ok, but with a shallow copy, the output will not increment the reader reference?
>>
>> On Mon, Jul 2, 2012 at 4:02 PM, David Gobbi <david.gobbi at gmail.com> wrote:
>>> A shallow copy isn't like a weakref.  A shallow copy will copy all the
>>> arrays from one data object to another data object by reference
>>> (strong reference, not weak reference).  A deep copy will create new
>>> arrays and copy all the values from the old arrays.
>>>
>>> I'm not sure how much git master will change before it is released, if
>>> that's what you are asking, but it already has the new pipeline
>>> features.
>>>
>>>  - David
>>>
>>> On Mon, Jul 2, 2012 at 1:26 PM, José M. Rodriguez Bacallao
>>> <jmrbcu at gmail.com> wrote:
>>>> so, a shallow copy is like a weakref in python no? I don't want to be
>>>> that minimalist (example 2) because example 2 does not copy any lookup
>>>> table, etc. How far is the git/master from what would be VTK 6.0?
>>>>
>>>> On Mon, Jul 2, 2012 at 2:36 PM, David Gobbi <david.gobbi at gmail.com> wrote:
>>>>> The original question was asking how to free the reader and keep the
>>>>> data.  When you do "output=reader.GetOutput()", the output keeps a
>>>>> reference to the reader, so the reader will not be freed until the
>>>>> output is freed.  This is why it sometimes make sense to copy the
>>>>> output into a new vtkImageData object.
>>>>>
>>>>> In VTK 6, if you call "output=reader.GetOutput()" then the output does
>>>>> not keep a reference to the reader, so memory management is a bit
>>>>> easier.
>>>>>
>>>>> Python memory management does what it's supposed to: it deletes
>>>>> objects that aren't referred to by any other objects.  If an object is
>>>>> part of a pipeline, it won't be deleted until 1) it is disconnected
>>>>> from the pipeline or 2) there are no external references to any of the
>>>>> objects that make up the pipeline.
>>>>>
>>>>>  - David
>>>>>
>>>>>
>>>>> On Mon, Jul 2, 2012 at 12:12 PM, Jothybasu Selvaraj <jothybasu at gmail.com> wrote:
>>>>>> Won't the auto garbage collection/ memory management in python manage this?
>>>>>>
>>>>>>
>>>>>> On Mon, Jul 2, 2012 at 7:05 PM, David Gobbi <david.gobbi at gmail.com> wrote:
>>>>>>>
>>>>>>> A shallow copy should be sufficient:
>>>>>>>
>>>>>>> def test(filename):
>>>>>>>    r = vtkgdcm.vtkGDCMImageReader()
>>>>>>>    r.SetFileName(filename)
>>>>>>>    r.Update()
>>>>>>>    img = vtk.vtkImageData()
>>>>>>>    img.ShallowCopy(r.GetOutput())
>>>>>>>    return img
>>>>>>>
>>>>>>> Or, to be even more minimalist, copy just the pixel data and nothing else:
>>>>>>>
>>>>>>> def test(filename):
>>>>>>>    r = vtkgdcm.vtkGDCMImageReader()
>>>>>>>    r.SetFileName(filename)
>>>>>>>    r.Update()
>>>>>>>    img = vtk.vtkImageData()
>>>>>>>    img.CopyStructure(r.GetOutput())
>>>>>>>    img.GetPointData().PassData(r.GetOutput().GetPointData())
>>>>>>>    return img
>>>>>>>
>>>>>>>  - David
>>>>>>>
>>>>>>> On Mon, Jul 2, 2012 at 10:17 AM, Jothy <jothybasu at gmail.com> wrote:
>>>>>>> > I think the first one.
>>>>>>> >
>>>>>>> > Jothy
>>>>>>> >
>>>>>>> > On 02-Jul-2012, at 5:06 PM, José M. Rodriguez Bacallao
>>>>>>> > <jmrbcu at gmail.com> wrote:
>>>>>>> >
>>>>>>> >> hi folks, how to correctly release memory using vtk from python
>>>>>>> >> for example, which one of this three code snnipets release the memory
>>>>>>> >> allocated when reading the file:
>>>>>>> >>
>>>>>>> >> def test(filename):
>>>>>>> >>    r = vtkgdcm.vtkGDCMImageReader()
>>>>>>> >>    r.SetFileName(filename)
>>>>>>> >>    r.Update()
>>>>>>> >>    img = vtk.vtkImageData()
>>>>>>> >>    img.DeepCopy(r.GetOutput())
>>>>>>> >>    return img
>>>>>>> >>
>>>>>>> >> --------------------------------------------------------------------------
>>>>>>> >> def test(filename):
>>>>>>> >>    r = vtkgdcm.vtkGDCMImageReader()
>>>>>>> >>    r.SetFileName(filename)
>>>>>>> >>    r.Update()
>>>>>>> >>    return r.GetOutput()
>>>>>>> >>
>>>>>>> >> ---------------------------------------------------------------------------
>>>>>>> >> r = vtkgdcm.vtkGDCMImageReader()
>>>>>>> >> r.SetFileName(filename)
>>>>>>> >> r.Update()
>>>>>>> >> img = r.GetOutput()
>>>>>>> >> img = None
>>>>>>> >> del img
>>>>>>> >> r = None
>>>>>>> >> del r



More information about the vtkusers mailing list