用于blender的python脚本中的内存泄漏

时间:2013-07-11 02:42:06

标签: python memory-leaks python-3.x blender

我对python很新(我通常使用c ++)。我编写了一个python脚本,使用光线跟踪算法将Blender对象转换为二进制掩码文件。

我最终会遇到巨大的内存泄漏。对于M = 512(如下所示),脚本会在脚本运行时增加RAM使用率,最终结果是使用了5.7GB。脚本运行后,RAM使用率也会保留,直到我关闭Blender。

我不确定open()命令是否将打开的文件存储在RAM中(我猜它确实如此),但这只占256MB的RAM使用量,因为这是生成的文件大小,并且也没有解释为什么在fo.close()之后RAM使用率仍然存在。

我确信我缺少一些非常简单的东西,但对python并不熟悉,我很难弄清楚它是什么。我已经尝试通过放置行

来清除pointInsideMesh()函数中使用的所有变量
axis  = None
mat1  = None
mat   = None
orig  = None
count = None
location = None
normal   = None
index    = None
outside1 = None
outside2 = None

return语句之前,但这并没有堵塞内存泄漏。这是我的代码:

import mathutils, numpy, bpy





def pointInsideMesh(point,ob):

    axes = [ mathutils.Vector((1,0,0)) ]
    outside1 = False
    for axis in axes:

        mat1 = mathutils.Matrix(ob.matrix_world)
        mat=mat1.invert()

        orig = mat1*point


        count = 0
        while True:
            location,normal,index = ob.ray_cast(orig,axis*10000.0)
            if index == -1: break
            count+= 1

            orig = location + axis*0.00001



        if (count%2 == 0):
            outside1 = True
            break




    axes = [ mathutils.Vector((0,1,0)) ]
    outside2 = False
    for axis in axes:

        mat1 = mathutils.Matrix(ob.matrix_world)
        mat=mat1.invert()

        orig = mat1*point


        count = 0
        while True:
            location,normal,index = ob.ray_cast(orig,axis*10000.0)
            if index == -1: break
            count+= 1

            orig = location + axis*0.00001



        if (count%2 == 0):
            outside2 = True
            break

    outside = outside1 or outside2
    return not outside




ob = bpy.context.active_object
M = 512
fileOut = 'D:\images\\maskFile.txt'

fo = open(fileOut , "w")
for n in range(0,M):
    for m in range(0,M):
        for l in range(0,M):
            if pointInsideMesh( mathutils.Vector(((l+1)/M-0.5,(m+1)/M-0.5,(n+1)/M-0.5)), ob ):
                fo.write("1")
            else:
                fo.write("0")
            if l < M-1:
                fo.write(" ")
        fo.write("\n") 
    fo.write("\n")          
fo.close()

非常感谢任何帮助:)

更新

import mathutils, numpy, bpy

def pointInsideMesh(point,ob):
    return False

ob = bpy.context.active_object
M = 512
fileOut = 'D:\images\\maskFile.txt'

fo = open(fileOut , "w")
for n in range(0,M):
    for m in range(0,M):
        for l in range(0,M):
            if pointInsideMesh( mathutils.Vector(((l+1)/M-0.5,(m+1)/M-0.5,(n+1)/M-0.5)), ob ):
                fo.write("1")
            else:
                fo.write("0")
            if l < M-1:
                fo.write(" ")
        fo.write("\n") 
    fo.write("\n")          
fo.close()

重现问题,但

import mathutils, numpy, bpy

def pointInsideMesh():
    return False

ob = bpy.context.active_object
M = 512
fileOut = 'D:\images\\maskFile.txt'

fo = open(fileOut , "w")
for n in range(0,M):
    for m in range(0,M):
        for l in range(0,M):
            if pointInsideMesh():
                fo.write("1")
            else:
                fo.write("0")
            if l < M-1:
                fo.write(" ")
        fo.write("\n") 
    fo.write("\n")          
fo.close()

没有,唯一的区别是在这两个的第一个例子中,被测试点(和对象)的位置被传递给函数,而在第二个例子中,没有传递参数。在c ++中,即使您通过值传递,函数中创建的参数的副本也将在函数返回时从内存中清除。但是这些参数在python中以不同的方式传递,这必然是问题的根源,因为我真的不明白它是如何工作的。

1 个答案:

答案 0 :(得分:0)

我唯一可以看到导致内存泄漏的是ob对象。

你对该对象512^3次做了些什么。如果ob.ray_castob对象上存储了一些数据,那么我可以看到这是一个问题。尝试替换

ob.ray_cast(orig,axis*10000.0)

有3个静态值并查看内存是否仍然存在。搅拌机的C侧可能存在内存泄漏。