使用Cython多处理共享内存

时间:2015-08-12 01:08:58

标签: arrays multiprocessing cython shared-memory

我试图用Cython和多处理包在共享内存中定义一个数组。但是,我无法在.pxd文件中声明此数组。

简单的测试代码如下。我有一个带有变量my_data的Cython类数据。这个变量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

然后,我在主文件中声明共享数组:

main_file.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 :(得分:0)

你遇到的问题是multiprocessing.Array不是一个numpy数组,而是一个“ctypes数组”(根据the multiprocessing documentation)。

使其工作的最简单方法是使用Cython typed memoryview功能,该功能接受任何具有阵列接口的功能:

# Data.pxd
cdef class Data:
    cdef public double[:] my_data

当我进行此更改时,您的程序运行正常,并且还可以使用numpy数组,python数组以及您尝试抛出的大多数其他内容。

请注意,此版本中不灵活的一件事是数组是一个双精度数组,您没有指定。如果你需要在这里接受任何数据类型(而不仅仅是双打),你很可能不能轻易地使用cdef类型。