每次调用
np.vstackNumPy时,都必须为一个全新的数组分配空间。因此,如果说1行需要1单位内存
np.vstack([container, container2])
需要 额外
900+5000的存储单元。此外,在分配发生之前,Python需要保留旧空间
mergedContainer(如果存在)以及新空间
mergedContainer。因此,
mergedContainer
使用分片进行迭代构建实际上比尝试通过单个调用进行构建需要更多的内存
np.vstack。
迭代构建:
| total | mergedContainer | container1 | container2 | temp | ||-------+-----------------+------------+------------+------+----------------------------------------------------------------------|| 7800 | 1900 | 900 | 5000 | 0 | mergedContainer = np.vstack((container1, container2[:1000])) || 11200 | 3400 | 900 | 5000 | 1900 | mergedContainer = np.vstack((mergedContainer, container[1000:2500])) || 13200 | 3900 | 900 | 5000 | 3400 | mergedContainer = np.vstack((mergedContainer, container[2500:3000])) |
通过一次调用np.vstack来构建它:
| total | mergedContainer | container1 | container2 | temp |||-------+-----------------+------------+------------+------+-------------------------------------------------------|| 11800 | 5900 | 900 | 5000 | 0 | mergedContainer = np.vstack((container1, container2)) |
但是,我们可以做得更好。而不是调用的
np.vstack重复, 分配所有需要的空间 ,一旦
从一开始双方的,写的内容
container1并
container2把它。换句话说,避免分配两个不同的数组
container1,
container2如果您最终知道要合并它们。
container = np.empty((5900, 4000))
请注意,基本切片(例如
container[:900]始终返回view)和view基本上不需要额外的内存。因此,您可以这样定义
container1和
container2:
container1 = container[:900] container2 = container[900:]
然后 在适当的位置 分配值。这将修改
container:
container1[:] = ... container2[:] = ...
因此,您的内存需求将保持在5900单位左右。
例如,
import numpy as npnp.random.seed(2015)container = np.empty((5, 4), dtype='int')container1 = container[:2] container2 = container[2:] container1[:] = np.random.randint(10, size=(2,4))container2[:] = np.random.randint(1000, size=(3,4))print(container)
产量
[[ 2 2 9 6] [ 8 5 7 8] [112 70 487 124] [859 8 275 936] [317 134 393 909]]
而只需要一个形状(5,4)阵列的空间,以及临时阵列的临时使用空间。
因此,您无需在代码中进行太多更改即可节省内存。只需设置
container = np.empty((5900, 4000))container1 = container[:900] container2 = container[900:]
然后使用
container1[:] = ...
代替
container1 = ...
以 就地 分配值。(或者,当然,您可以直接写入
container。)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)