2016-04-01 22 views
0

Belirli bir geometrinin birim hücresini yaratan ve çoğaltabileceğim şekilde, onu kopyalayan oldukça karmaşık bir python programı yazdım. birim hücrenin 3x3x3 dizisi. Sonuç bir .stl olarak kaydedilir. Amaç, CAD kullanmak yerine bu yapıları doğrudan oluşturmaktı.Python ve VTK ile bellek yönetimi

Sorunum, hesaplama zamanının rahatsız edici olduğu (8x8x8 için ~ 2 dakika, genellikle ihtiyacım olandan daha küçüktür). En büyük sorun, 10x10x10'un bile mümkün olmadığıdır. VTK hemen bir hata atıyor "8 baytlık boyuttaki elemanların [büyük sayısının] atanması mümkün değil." Bu benim bellek yönetimimin yetersiz olduğuna (varolmayan) inanmamı sağlıyor.

vtkSmartPointer hakkında okudum, ancak yalnızca C++ için açıklamalar bulabilir. vtkSmartPointer python ile doğru şekilde nasıl kullanırım? C++ ile herhangi bir deneyimim olmadığını eklemeliyim. Program boyutundan dolayı bir MWE imkansızdır. İşte yerine benim algoritması boru hattının bir kısmının kısaltılmış örneğidir:

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() 

Bu benim filtrelerin çok kullanmak ve onları silme veya herhangi bir şey umurumda asla olduğunu göstermesi gerekmektedir. Belleğimi temizlemek için doğru/tercih edilen yol nedir?

cevap

0

Bunu yayınladığımdan beri, VTK ve Python hakkında çok şey okudum, Python'un bellek yönetiminin kendisi ile ilgilendiği sonucuna vardı. SmartPointers ve Delete() sadece C++ ortamında gerekli olmalıdır. Ayrıca, programın genel performansını büyük ölçüde geliştiren Python 2.7 ve VTK 6.2'den Python 3.4 ve VTK 7.0 sürümlerine yükseltilmiştim. Bu nedenle, sorunun eski VTK sürümü ile olduğunu düşünüyorum.