Cython 多处理共享内存
Shared memory with Cython multiprocessing
我正在尝试使用 Cython 和多处理包在共享内存中定义一个数组。但是,我无法在 .pxd 文件中声明此数组。
简单的测试代码如下。我有一个带有变量 my_data 的 Cython class 数据。此变量 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 以便它可以与多进程共享?
您遇到的问题是 multiprocessing.Array
不是一个 numpy 数组,而是一个 "ctypes array"(根据 the multiprocessing documentation)。
使其工作的最简单方法是使用 Cython typed memoryview 功能,它接受任何具有数组接口的内容:
# Data.pxd
cdef class Data:
cdef public double[:] my_data
当我进行此更改时,您的程序可以正常工作,并且也可以很好地处理 numpy 数组、python 数组以及您尝试扔给它的大多数其他东西。
请注意,此版本中不灵活的一件事是该数组是您未指定的双精度数组。如果您需要在此处接受任何数据类型(而不仅仅是双精度),您可能无法轻松地使用 cdef 类型。
我正在尝试使用 Cython 和多处理包在共享内存中定义一个数组。但是,我无法在 .pxd 文件中声明此数组。
简单的测试代码如下。我有一个带有变量 my_data 的 Cython class 数据。此变量 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 以便它可以与多进程共享?
您遇到的问题是 multiprocessing.Array
不是一个 numpy 数组,而是一个 "ctypes array"(根据 the multiprocessing documentation)。
使其工作的最简单方法是使用 Cython typed memoryview 功能,它接受任何具有数组接口的内容:
# Data.pxd
cdef class Data:
cdef public double[:] my_data
当我进行此更改时,您的程序可以正常工作,并且也可以很好地处理 numpy 数组、python 数组以及您尝试扔给它的大多数其他东西。
请注意,此版本中不灵活的一件事是该数组是您未指定的双精度数组。如果您需要在此处接受任何数据类型(而不仅仅是双精度),您可能无法轻松地使用 cdef 类型。