Cython多进程共享内存

3

我正在尝试使用Cython和multiprocessing包在共享内存中定义一个数组。但是,我无法在.pxd文件中声明此数组。

以下是简单的测试代码。我有一个名为Data的Cython类,其中包含变量my_data。这个变量my_data将是共享数组。

Data.pxd:

    cimport numpy as np
    cdef class Data:
        cdef public np.ndarray my_data

Data.pyx:

    cdef class Data:
        def __init__(self):
            pass

然后,我在主文件中声明了共享数组:
主文件.py:
    # -*- coding: utf-8 -*-
    import pyximport; 
    import numpy as np
    from multiprocessing import Array
    pyximport.install(setup_args={"include_dirs":np.get_include()},)

    from Data import *

    ### Create Data
    N  = 1500
    dc = Data()
    dc.my_data  = Array('d', N, lock=False)

运行 main_file.py 时出现 TypeError:
    TypeError: Cannot convert c_double_Array_1500 to numpy.ndarray

我尝试将my_data声明为cpython数组,但是它会出现相同的TypeError错误。 有没有一种方法可以在Data.pxd中声明my_data,以便可以与多进程共享?

1个回答

0
你遇到的问题是 multiprocessing.Array 不是一个 numpy 数组,而是一个 “ctypes 数组”(根据 multiprocessing 文档所述)。
最简单的解决方法是使用 Cython typed memoryview 特性,它接受任何具有数组接口的东西:
# Data.pxd
cdef class Data:
    cdef public double[:] my_data

当我进行这个更改后,您的程序可以正常工作,并且也可以与numpy数组、python数组以及大多数其他尝试使用它的东西一起正常工作。
请注意,在此版本中不灵活的一件事是数组是双精度数组,您没有指定。如果您需要在此处接受任何数据类型(而不仅仅是双精度),则可能无法轻松地使用cdef类型实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接