# Processing slows down after many iterations

**URL:** <https://discourse.slicer.org/t/processing-slows-down-after-many-iterations/27910>\
**Category:** Development\
**Created:** [February 17, 2023, 10:51pm UTC](https://discourse.slicer.org/t/processing-slows-down-after-many-iterations/27910 "2023-02-17T22:51:34Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![nrex45](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/nrex45/32/7664_2.png) [@nrex45](https://discourse.slicer.org/u/nrex45)\
**Post date:** [February 17, 2023, 10:51pm UTC](https://discourse.slicer.org/t/processing-slows-down-after-many-iterations/27910/1 "2023-02-17T22:51:34Z")

</div>

Somewhat related question: I’m looping through the following code a couple of hundred times and after a while slicer starts to run slower and slower… based on experience this usually means I’m creating some kind of node (or maybe a widget in this case?) that accumulates and bogs Slicer down.

I’m removing all of the nodes I am creating (besides maybe the widget…) - is there anything I can do to prevent slowing of the program?

```auto
import vtkSegmentationCorePython as vtkSegmentationCore

def generate_subtracted_files(cwd, first_seg, second_seg,output_name,final_subtraction):
    
    ### load segmentations
    cwd = os.getcwd()
    vol = slicer.util.loadVolume(cwd+"/"+"fu0.nrrd")
    seg = slicer.util.loadSegmentation(cwd+"/"+first_seg)
    seg2 = slicer.util.loadSegmentation(cwd + "/" + second_seg)
    seg.SetReferenceImageGeometryParameterFromVolumeNode(vol)
    seg2.SetReferenceImageGeometryParameterFromVolumeNode(vol)
    
    
    ### create new segmentation, add loaded segmentations
    seg.CreateClosedSurfaceRepresentation()
    seg2.CreateClosedSurfaceRepresentation()
    csr1 = vtk.vtkPolyData()
    seg.GetClosedSurfaceRepresentation(seg.GetSegmentation().GetNthSegmentID(0), csr1)
    csr2 = vtk.vtkPolyData()
    seg2.GetClosedSurfaceRepresentation(seg2.GetSegmentation().GetNthSegmentID(0), csr2)
    segmentationNodeNew = slicer.vtkMRMLSegmentationNode()
    slicer.mrmlScene.AddNode(segmentationNodeNew)
    segmentationNodeNew.CreateDefaultDisplayNodes()
    segmentationNodeNew.SetReferenceImageGeometryParameterFromVolumeNode(vol)
    segmentationNodeNew.AddSegmentFromClosedSurfaceRepresentation(csr2,"first",[0,1,0])
    segmentationNodeNew.AddSegmentFromClosedSurfaceRepresentation(csr1,"second",[0,0,1])
    
    ### load segment editor widget
    segmentEditorWidget = slicer.qMRMLSegmentEditorWidget()
    segmentEditorWidget.setMRMLScene(slicer.mrmlScene)
    segmentEditorNode = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLSegmentEditorNode")
    segmentEditorWidget.setMRMLSegmentEditorNode(segmentEditorNode)
    
    ### perform subtraction operations
    segmentEditorWidget.setSegmentationNode(segmentationNodeNew)
    segmentEditorWidget.setActiveEffectByName("Logical operators")
    effect = segmentEditorWidget.activeEffect()
    effect.self().scriptedEffect.setParameter("Operation","SUBTRACT")
    selectedSegmentID = effect.self().scriptedEffect.parameterSetNode().GetSelectedSegmentID()
    effect.self().scriptedEffect.setParameter("BypassMasking", 1)
    effect.self().scriptedEffect.setParameter("ModifierSegmentID",segmentationNodeNew.GetSegmentation().GetNthSegmentID(1))
    effect.self().onApply()
    segmentationNodeNew.RemoveSegment("second")
    
    myStorageNode = segmentationNodeNew.CreateDefaultStorageNode()
    myStorageNode.SetFileName(output_name)
    myStorageNode.WriteData(segmentationNodeNew)
    
    
    slicer.mrmlScene.RemoveNode(vol)
    slicer.mrmlScene.RemoveNode(segmentEditorNode)
    slicer.mrmlScene.RemoveNode(seg)
    slicer.mrmlScene.RemoveNode(seg2)
    slicer.mrmlScene.RemoveNode(segmentationNodeNew)
    slicer.mrmlScene.RemoveNode(myStorageNode)
    return(True)

```

---

<div class="post-metadata">

**Author:** ![lassoan](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/lassoan/32/13_2.png) [@lassoan](https://discourse.slicer.org/u/lassoan)\
**Post date:** [February 19, 2023, 2:18am UTC](https://discourse.slicer.org/t/processing-slows-down-after-many-iterations/27910/2 "2023-02-19T02:18:05Z")

</div>

This is almost always due to memory leaks. You can confirm by monitoring the memory usage of the application. If memory usage is continuously increasing then it means your script causes a memory leak.

You can fix it by deleting all objects that you create. VTK and Python objects are all reference counted and so objects usually get automatically deleted once there are no more Python variable referencing them. However, you used factory methods (such as slicer.vtkMRMLSegmentationNode()) then you need to call `Unregister` to prevent leaks. See more information [here](https://slicer.readthedocs.io/en/latest/developer_guide/advanced_topics.html#factory-methods).
