我正在尝试在this post之后使用多处理来填充一个numpy数组。我在Mac上运行良好,但是当我将其移植到Ubuntu时,很多时候出现段错误。

我将代码简化为以下最小示例:

import numpy as np
from multiprocessing import sharedctypes

a = np.ctypeslib.as_ctypes(np.zeros((224,224,3)))
print("Made a, now making b")
b = sharedctypes.RawArray(a._type_, a)
print("Finished.")

在Ubuntu 16.04,Python 3.6.5和numpy 1.15.4(与Mac相同的版本)上,我得到了输出
Made a, now making b
Segmentation fault (core dumped)

现在,我可以稍微更改数组的尺寸,并且在某些情况下可以使用(例如,将第一个224更改为100即可使用)。但是大多数情况下它都是断层故障。

谁能提供任何见解?

我看到了one post on a related topic from 2016 that no one responded to和未使用的another one involving pointers

PS- 我是否将a指定为多维数组或展平的数组(例如np.zeros(224*224*3))似乎都没有什么区别。如果我更改数据类型(例如,将float转换为int),这似乎也没有什么不同;它失败一样。

另一个更新:即使在original post中的代码中设置“size = 224”,也会在具有不同numpy版本的两台不同的Ubuntu计算机上导致seg错误,但在Mac上运行良好。

最佳答案

这更多的是猜测,而不是答案,但是由于底层数据缓冲区的垃圾回收,您可能会遇到问题。这可以解释为什么似乎要依赖于您要创建的数组的整体大小。

如果是这种情况,那么解决方法是将您创建的Numpy零数组分配给它自己的变量。这将确保通过创建RawArray缓冲区“存在”。该代码将是:

zs = np.zeros((224,224,3))
a = np.ctypeslib.as_ctypes(zs)
print("Made a, now making b")
b = sharedctypes.RawArray(a._type_, a)
print("Finished.")

我现在只有一台Mac,因此无法亲自测试。

关于python - 创建多处理数组时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53757856/

10-16 12:59
查看更多