初始化大型共享阵列

时间:2019-02-13 18:18:29

标签: python shared-memory numpy-ndarray

我需要初始化一个大小大于2 ^ 32(multiprocessing.sharedctypes.RawArray)的共享数组。

(据我所知,SO推荐的)初始化共享数组并像numpy一样使用它作为ndarray的方法如下:

arr = np.array(data)
shared_arr = RawArray(type, arr.size)
shared_ndarr = np.ctypeslib.as_array(shared_arr).reshape(arr.shape)
np.copyto(shared_ndarr, arr)

但是这会引发以下异常:(我在问题的末尾复制了RawArray的相关代码作为附录)

  

RawArray中第67行的文件“ ...”
   type_ = type_ * size_or_initializer
  OverflowError:“ _ length_”属性太大

我读到,这可能是由于从Python整数类型到C整数类型的转换而发生的。我测试过,仅当RawArray()的第二个参数大于2.147.483.647(带符号的int32的最大值)时,才会引发此异常。

我的问题是:
有没有办法告诉C编译器将int64用作第二个参数?
还是可以串联共享数组?因此,我可以将它们初始化为小块,然后将它们组合在一起。 (This这样的问题提示,如果不将阵列移出共享内存,是不可能的。)

也欢迎其他想法和解决方案!

附录:

typecode_to_type = {
    'c': ctypes.c_char,  'u': ctypes.c_wchar,
    'b': ctypes.c_byte,  'B': ctypes.c_ubyte,
    'h': ctypes.c_short, 'H': ctypes.c_ushort,
    'i': ctypes.c_int,   'I': ctypes.c_uint,
    'l': ctypes.c_long,  'L': ctypes.c_ulong,
    'f': ctypes.c_float, 'd': ctypes.c_double
    }

def RawArray(typecode_or_type, size_or_initializer):
    '''
    Returns a ctypes array allocated from shared memory
    '''
    type_ = typecode_to_type.get(typecode_or_type, typecode_or_type)
    if isinstance(size_or_initializer, int):
        type_ = type_ * size_or_initializer
        obj = _new_value(type_)
        ctypes.memset(ctypes.addressof(obj), 0, ctypes.sizeof(obj))
        return obj
    else:
        type_ = type_ * len(size_or_initializer)
        result = _new_value(type_)
        result.__init__(*size_or_initializer)
        return result

0 个答案:

没有答案