gpt4 book ai didi

python - 内存泄漏调用带有大 numpy 数组参数的 cython 函数?

转载 作者:太空狗 更新时间:2023-10-30 00:10:34 25 4
gpt4 key购买 nike

我正在尝试编写调用以下 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(),但它不起作用。最后,程序会被系统杀死,因为它已经吃掉了所有的内存。我注意到这个问题只发生在 cdefcpdef 函数上,如果我将它更改为 def 它工作正常。

我认为 test1 应该将这些数组的引用传递给 test2 而不是对象。但似乎它创建了这些数组的新对象并将它们传递给 test2,并且这些对象之后再也不会被 python gc 触及。

我错过了什么吗?

最佳答案

我对这个问题仍然很困惑。但是我找到了另一种方法来绕过这个问题。只需明确告诉 cython 像这样传递指针:

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[0,0], &nkw[0,0], &phi[0,0])


cdef int test2(np.int32_t* ndk,
np.int32_t* nkw,
np.float64_t* phi):
return 1

但是,您需要像这样索引数组:ndk[i*row_len + j]详情:https://github.com/cython/cython/wiki/tutorials-NumpyPointerToC

关于python - 内存泄漏调用带有大 numpy 数组参数的 cython 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29247373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com