首页 文章

为什么不能腌制cython内存视图?

提问于
浏览
2

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

double[:,:] foo

我想使用多处理并行运行此模块 . 但是我得到错误:

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

为什么我不能挑选内存视图,我该怎么办呢 .

1 回答

  • 0

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

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

    我不知道这对你有帮助,但我遇到了类似的问题 . 我使用memoryview作为cdef类中的属性 . 我必须编写自己的reducesetstate方法来正确地解开我 class 的实例 . 使用 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 ),一个可调用的参数元组(即创建'new'Foo实例所需的内容,在本例中是保存的矩阵)和包含恢复所需的所有值的字典组成 . 实例 .

相关问题