嵌入python / cython numpy数组:将numpy数组传递给c指针

时间:2019-01-14 13:23:13

标签: c arrays overflow embed cython

我正在尝试将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

任何人都可以给我提示这里出了什么问题或如何调试吗?

谢谢和欢呼, 蒂姆

2 个答案:

答案 0 :(得分:0)

该内存归Numpy数组所有,并在numpy数组的引用计数降至零(这很可能在create_np_array的末尾)时释放。未能Py_Finalize()尝试释放所有个剩余的Python对象。

您访问此内存的尝试总是 无效-仅对某些大小的数组失败的事实只是“运气”。

没有任何一种好的解决方案,但是这里有一些建议:

  1. 使用Py_INCREF来手动增加拥有的numpy数组的引用计数(然后在完成对它持有的内存的处理后再次手动减小它的引用计数),以便不会在结束时销毁它功能。确保在Py_Finalize之前保留内存访问权限。

  2. 处理C代码中的内存分配,并将其分配给Numpy数组,以便numpy数组不使用PyArray_SimpleNewFromData拥有它。您必须小心,Numpy数组不会超过内存。

答案 1 :(得分:0)

好,终于找到了有用的提示答案

最好在blog post中描述这个想法,其中包括github上的完整代码示例。因此,我只是在此引用这篇帖子,它详细回答了这个问题。

谢谢!