gpt4 book ai didi

python - 由于使用 PyArray_ENABLEFLAGS 导致 Jupyter 崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 07:50:23 25 4
gpt4 key购买 nike

我尝试在 Cython 上将 C double* 转换为 numpy 数组,但我还没有成功。我找到了这些有用的链接: Force NumPy ndarray to take ownership of its memory in Cython https://github.com/numpy/numpy/issues/8253

但每次我在 Cython 中使用以下 .pyx 文件时,它都会使 Jupyter 崩溃(死内核):

.c文件:

#include<stdlib.h>
#include "test.h"

double* test1(int n) {
double* A=(double*)calloc(n,sizeof(double));
int i;
for (i=0;i<n;i++) {
A[i]=i+0.5; }
return(A); }

我也尝试使用 malloc 得到相同的结果。

.pyx 文件:

cimport c_test
import numpy as np
cimport numpy as np

np.import_array()

ctypedef np.float64_t DTYPE_t

cdef extern from "numpy/arrayobject.h":
void PyArray_ENABLEFLAGS(np.ndarray arr, int flags)

cdef data_to_numpy_array_with_spec(void * ptr, np.npy_intp N, int t):
cdef np.ndarray[DTYPE_t, ndim=1] arr = np.PyArray_SimpleNewFromData(1, &N, t, ptr)
PyArray_ENABLEFLAGS(arr, np.NPY_OWNDATA)
return arr

def test(n):
cdef double* t1
t=data_to_numpy_array_with_spec(c_test.test1(n),n,np.NPY_FLOAT64)
return(t)

c_fct.test1 函数返回一个 C double* of n double,我想将其转换为拥有数据的 numpy 数组以避免内存泄漏。没有行 PyArray_ENABLEFLAGS(t, np.NPY_ARRAY_OWNDATA) 一切正常,但当 numpy 数组被销毁时,内存不会被释放。

jupyter 笔记本:

import cy_test as ct
ct.test(1000)

c_test.pxd 文件:

cdef extern from "test.h":
double* test1(int n)

我的 setup.py 文件如下所示:

from setuptools import setup
from setuptools.extension import Extension
from Cython.Distutils import build_ext
from Cython.Build import cythonize
import numpy as np

ext_modules = cythonize([Extension("cy_test", ["cy_test.pyx","test.c"])])


setup(
name = 'Hello world app',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules,
include_dirs=[np.get_include()]
)

我认为我的问题可能来自与 github 链接中相同的原因,但我不知道如何解决它(在我的情况下,C 指针已经存在,所以我认为我不能使用相同的解决方案) .

我在使用 Anaconda 64 位的 Windows 10 上工作,以下是版本的详细信息:3.7.1(默认,2018 年 12 月 10 日,22:54:23)[MSC v.1915 64 位 (AMD64)]

最佳答案

Github issue 中所述您链接的 NPY_OWNDATA 只能安全地用于通过 NumPy 本身使用的相同分配器分配的内存。可以通过 PyDataMem_* 访问此分配器功能。如果您的内存不是来自此分配器,则不能使用 NPY_OWNDATA

不要试图强制数组获取您提供给它的任意内存的所有权。相反,使用 PyArray_SetBaseObject 将数组的 base 设置为知道如何执行正确清理的对象。 . capsule可能是一个方便使用的对象。

关于python - 由于使用 PyArray_ENABLEFLAGS 导致 Jupyter 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54269956/

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