我正在尝试将cython-numpy数组传递给c结构。有时可以正常工作,但是如果阵列变得“太大”则会崩溃。虽然这不是很大(例如<100k个双精度类型的条目),但我无法弄清楚此限制的来源。一些代码片段(完整的代码随附)。
基于Win7,Cython 0.28.4,Python 3.6,mingw64
我尝试了使用不同长度的数组。我发现的最新一件事是,如果数组长度大于2 ** 16-512项,它将始终崩溃。但是我不知道为什么。
cython文件:
is
对于c文件:
//cy_file.pyx
//...
cdef public struct Container:
double* np_array
// ...
cdef public void create_np_array(Container *container):
cdef numpy.ndarray[numpy.float_t, ndim=1, mode = 'c'] np_array
# just create a numpy array
longarray = np.linspace(1.0, 5.0, 100000)
np_array = numpy.ascontiguousarray(numpy.array(longarray), dtype=float)
container.np_array = <double*> np_array.data
任何人都可以给我提示这里出了什么问题或如何调试吗?
谢谢和欢呼, 蒂姆
答案 0 :(得分:0)
该内存归Numpy数组所有,并在numpy数组的引用计数降至零(这很可能在create_np_array
的末尾)时释放。未能Py_Finalize()
尝试释放所有个剩余的Python对象。
您访问此内存的尝试总是 无效-仅对某些大小的数组失败的事实只是“运气”。
没有任何一种好的解决方案,但是这里有一些建议:
使用Py_INCREF
来手动增加拥有的numpy数组的引用计数(然后在完成对它持有的内存的处理后再次手动减小它的引用计数),以便不会在结束时销毁它功能。确保在Py_Finalize
之前保留内存访问权限。
处理C代码中的内存分配,并将其分配给Numpy数组,以便numpy数组不使用PyArray_SimpleNewFromData
拥有它。您必须小心,Numpy数组不会超过内存。
答案 1 :(得分:0)