python - 带有 numpy ctypes 的大数组

标签 python arrays numpy ctypes

我有一个接收 int 数组的 C++ 函数,我正在用 ctypesnumpy 为它制作一个 python 包装器。这是一个最小的例子:

复制.cpp

#include <vector>

extern "C" std::vector<int>* copy_vec(int* array, int size){    
    std::vector<int>* vec = new std::vector<int>(size);
    for (int i=0; i<size; i++){
        vec->push_back(array[i]);
    }
    return vec;
}

复制.py

import ctypes as ct
import numpy as np

INT_POINTER = ct.POINTER(ct.c_int)

_lib = ct.cdll.LoadLibrary('./libcopy.dll')
_lib.copy_vec.argtypes = [INT_POINTER, ct.c_int]

def copy(nums):
    size = len(nums)
    nums_c = np.array(nums).ctypes.data_as(INT_POINTER)
    vector = _lib.copy_vec(nums_c, size)
    return vector

array =[12]*1000000
copy(array)

这会产生以下错误消息:

---------------------------------------------------------------------------
WindowsError                              Traceback (most recent call last)
<ipython-input-2-752101759a61> in <module>()
      1 array =[12]*1000000
----> 2 copy(array)

<ipython-input-1-f18316d64ae3> in copy(nums)
     10     size = len(nums)
     11     nums_c = np.array(nums).ctypes.data_as(INT_POINTER)
---> 12     vector = _lib.copy_vec(nums_c, size)
     13 
     14     return vector

WindowsError: exception: access violation reading 0x08724020

此代码适用于像 array =[12]*100 这样的小数组,但在使用大数组时会失败。

最佳答案

找了半天才发现问题

我使用 np.array(nums) 创建了一个数组,然后使用 .ctypes.data_as(INT_POINTER) 创建了一个指向该数组的 ctypes 指针。由于没有保留 numpy 数组的引用,因此指针将指向一个临时变量。解决这个问题的方法是在 python 中保留对数组的引用。

nums_a = np.array(nums)
nums_c = nums_a.ctypes.data_as(INT_POINTER)

完整的函数是:

def copy(nums):
    size = len(nums)
    nums_a = np.array(nums)
    nums_c = nums_a.ctypes.data_as(INT_POINTER)  
    vector = _lib.copy_vec(nums_c, size)

    return vector

对于小型阵列,可能有足够的时间在回收其内存之前完成复制阵列,但对于大型阵列,这种内存回收可能具有更高的优先级。

更多内容可以在 numpy.ndarray.ctypes 阅读

关于python - 带有 numpy ctypes 的大数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49803464/

相关文章:

python - python列中字母的频率-速度优化

python - 将 JSON 发送到 Flask,request.args 与 request.form

java - 理解Java new Class[]数组和实现

python - numpy 中两个二维掩码数组的快速内积

python - 查找数组中一行的最小或最大总和

python - pydev - 有人可以解释一下这些错误吗

python - ValueError : Shapes (16, ) 和 (1, 16) 在 tensorflow1.0 中不兼容

c - 如何使用 C 中的指针对大小未知的数字数组进行排序

php - 我不断使用 json_decode 获取数组到字符串的转换错误

python - python中数组元素的数量小于截止数组的每个元素