3

我有一个使用 memoryview 数组的 cython 模块,即...

double[:,:] foo

我想使用多处理并行运行这个模块。但是我得到了错误:

PicklingError: Can't pickle <type 'tile_class._memoryviewslice'>: attribute lookup tile_class._memoryviewslice failed

为什么我不能腌制内存视图,我能做些什么。

4

1 回答 1

2

也许传递实际数组而不是内存视图可以解决您的问题。如果你想并行执行一个函数,如果我没记错的话,它的所有参数都必须是可选的。至少python多处理就是这种情况。因此,您可以将数组传递给函数并在函数内创建 memoryview。

def some_function(matrix_as_array):
    cdef double[:,:] matrix = matrix_as_array
    ...

我不知道这是否对您有帮助,但我遇到了类似的问题。我在 cdef 类中使用 memoryview 作为属性。我必须编写自己的__reduce__方法__setstate__来正确解开我的类的实例。numpy.asarray通过使用和恢复它来将内存视图作为数组酸洗__setstate__对我有用。我的代码的简化版本:

import numpy as np

cdef class Foo:
    cdef double[:,:] matrix

    def __init__(self, matrix):
        '''Assign a passed array to the typed memory view.'''
        self.matrix = matrix

    def __reduce__(self):
        '''Define how instances of Foo are pickled.'''
        d=dict()
        d['matrix'] = np.asarray(self.matrix)
        return (Foo, (d['matrix'],), d)

    def __setstate__(self, d):
        '''Define how instances of Foo are restored.'''
        self.matrix = d['matrix']

请注意,它__reduce__返回一个元组,该元组由一个可调用Foo的(实例。

于 2014-03-07T14:10:49.570 回答