我有一个使用 memoryview 数组的 cython 模块,即...
double[:,:] foo
我想使用多处理并行运行这个模块。但是我得到了错误:
PicklingError: Can't pickle <type 'tile_class._memoryviewslice'>: attribute lookup tile_class._memoryviewslice failed
为什么我不能腌制内存视图,我能做些什么。
我有一个使用 memoryview 数组的 cython 模块,即...
double[:,:] foo
我想使用多处理并行运行这个模块。但是我得到了错误:
PicklingError: Can't pickle <type 'tile_class._memoryviewslice'>: attribute lookup tile_class._memoryviewslice failed
为什么我不能腌制内存视图,我能做些什么。
也许传递实际数组而不是内存视图可以解决您的问题。如果你想并行执行一个函数,如果我没记错的话,它的所有参数都必须是可选的。至少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
的(实例。