我需要初始化一个大小大于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