【发布时间】:2021-05-04 12:31:21
【问题描述】:
假设我们使用 stride 技巧创建了一个 numpy 数组,其中包含另一个数组的视图:
import numpy as np
from numpy.lib import stride_tricks
x = np.arange(20).reshape([4, 5])
arr = stride_tricks.as_strided(x, shape=(3, 2, 5),strides=(20, 20, 4))
我们可以确认这个新数组确实是一个视图:
assert not arr.flags['OWNDATA']
# True
问题:
如果我将arr 作为参数传递给multiprocessing.Process(),arr 是否会被复制到每个进程中? x 会被复制吗?请解释原因。
【问题讨论】:
-
我建议尝试一个小例子。我没有太多使用多处理,所以不能说视图会发生什么。虽然
as_strided视图不会增加内存使用,但使用它的许多操作会。我最近帮助了一位发帖人,他发现std导致了内存错误,因为它从视图中减去了平均值。 -
是的,每个参数都被腌制,然后在新进程中反序列化。
x是否被复制取决于。 -
@juanpa.arrivillaga 你怎么能在不制作全新副本的情况下反序列化?
-
@MarkRansom 哦,参数总是被复制的。
x是一个全局变量。这取决于如何/是否使用x以及如何创建进程(例如 fork 与 spawn)
标签: python arrays numpy multiprocessing stride