【发布时间】:2015-03-25 04:19:14
【问题描述】:
我正在尝试编写调用以下 cython 函数 test1 的 python 代码,如下所示:
def test1( np.ndarray[np.int32_t, ndim=2] ndk,
np.ndarray[np.int32_t, ndim=2] nkw,
np.ndarray[np.float64_t, ndim=2] phi):
for _ in xrange(int(1e5)):
test2(ndk, nkw, phi)
cdef int test2(np.ndarray[np.int32_t, ndim=2] ndk,
np.ndarray[np.int32_t, ndim=2] nkw,
np.ndarray[np.float64_t, ndim=2] phi):
return 1
我的纯python代码会调用test1并传递3个numpy数组作为参数,它们非常大(大约10^4*10^3)。 test1 将依次调用使用 cdef 关键字定义的 test2 并传递这些数组。由于test1在返回之前需要多次调用test2(大约10^5),并且test2不需要在cython代码之外调用,所以我使用cdef代替def.
但问题是,每次 test1 调用 test2 时,内存开始稳步增加。我试图在这个 cython 代码之外调用gc.collect(),但它不起作用。最后,程序会被系统杀死,因为它已经吃掉了所有的内存。我注意到这个问题只发生在 cdef 和 cpdef 函数中,如果我把它改成 def 就可以了。
我认为 test1 应该将这些数组的引用传递给 test2 而不是对象。但似乎它创建了这些数组的新对象并将它们传递给 test2,并且这些对象之后再也不会被 python gc 触及。
我错过了什么吗?
【问题讨论】:
-
我无法重现该问题。将
np.ones((10^^4, 10^^3), dtype=...)传递给ndk, nkw, phi并多次运行test1可以正常工作。内存似乎没有增加多少。