2016-04-01 3 views
0

Я написал довольно сложную программу на языке питона, которая создает элементарную ячейку определенной геометрии и дублирует ее так, что я получаю, например. массив 3x3x3 элементарной ячейки. Результат сохраняется как .stl. Цель заключалась в том, чтобы создать эти структуры напрямую, вместо использования САПР.Управление памятью с помощью python и VTK

Моя проблема заключается в том, что время вычисления раздражает (~ 2 минуты для 8x8x8, что меньше, чем мне нужно). Самая большая проблема заключается в том, что 10x10x10 даже невозможен. VTK немедленно выдает ошибку «Невозможно выделить [большое количество] элементов размером 8 байтов». Это заставляет меня думать, что моего управления памятью недостаточно (не существует).

Я прочитал около vtkSmartPointer, но может только найти объяснения для C++. Как правильно использовать vtkSmartPointer с python? Я должен добавить, что у меня нет никакого опыта работы с C++.

MWE является невозможным из-за размера программы. Вот сокращенный пример части моего алгоритма трубопровода вместо:

import vtk 

appendFilter = vtk.vtkAppendPolyData() 

    # create all 12 struts and combine them into one object 
    for i in range(1, 13, 1): 
     tf = create_strut(i, node_dist, amp, d, sides, mode, render=False) # method that creates my unit cell out of 12 struts, parameters are irrelevant 
     appendFilter.AddInputData(tf.GetOutput()) 
     appendFilter.Update() 

    # clean up poly data 
    cleanFilter = vtk.vtkCleanPolyData() 
    cleanFilter.SetInputConnection(appendFilter.GetOutputPort()) 
    cleanFilter.Update() 

    # cut the cell to its right size 
    planes = plane_collection(node_dist) # method that generates 6 planes 
    clip = vtk.vtkClipClosedSurface() 
    clip.SetInputData(cleanFilter.GetOutput()) 
    clip.SetClippingPlanes(planes) 
    clip.Update() 

    # assemble an array from the unit cell 
    array = duplicate_cells(clip, xyz[0], xyz[1], xyz[2], node_dist) 

    # save as .stl 
    data = array.GetOutputPort() 
    stlwriter = vtk.vtkSTLWriter() 
    stlwriter.SetInputConnection(data) 
    stlwriter.SetFileName("Z:/example.stl") 
    stlwriter.Update() 
    stlwriter.Write() 

Это должно продемонстрировать, что я использую много фильтров и никогда не заботиться об удалении их или что-нибудь. Каков правильный/предпочтительный способ очистки памяти?

ответ

0

Поскольку я опубликовал это, я много читал о VTK, и Python пришел к выводу, что Python сам позаботится об управлении памятью. SmartPointers и Delete() должны быть необходимы только в среде C++.

Кроме того, я обновился от Python 2.7 и VTK 6.2 до Python 3.4 и VTK 7.0, что значительно улучшило общую производительность программы. Поэтому я думаю, что проблема была в старой версии VTK.

Смежные вопросы