gpt4 book ai didi

python - 如何使用大阵列来防止大量使用 RAM?

转载 作者:行者123 更新时间:2023-11-28 21:20:24 24 4
gpt4 key购买 nike

一个文件为我提供了一个 400x400x200x1 的数组和一个形状。根据阵列传输的数据,形状会发生变化。我的任务是使 400x400x200x1 数组适应其包含的数据。
例如:

shape = np.array([20,180,1,1])
b= []
l = np.load("testfile.npy")
d = (np.reshape(l[:shape[0],:shape[1],:shape[2],:shape[3]],(shape[0],shape[1]))).transpose()
append(d)

想法是创建一个新数组,其大小适应其数据。现在问题来了:我必须多次执行此过程,但每次执行时,我的 RAM 负载因子都会增加。:

shape = np.array([20,180,1,1])
b= []
for j in range(9):
l = np.load("testfile.npy")
d = (np.reshape(l[:shape[0],:shape[1],:shape[2],:shape[3]],(shape[0],shape[1]))).transpose()
time.sleep(2)
b.append(d)

load factor

仅仅是因为附加数组太大了吗?我附加的输出数组的大小为 180x20...但是 RAM 负载因子每次增加 0.12GB。是否有更有效的存储数组的方法,没有临时文件?

谢谢,对不起我的英语。

最佳答案

在您的示例中,您的错误是在 for 循环的每次迭代中重新加载文件。尝试:

l = np.load("testfile.npy")
shape = np.array([20,180,1,1])
b = []
for j in range(9):
d = (np.reshape(l[:shape[0],:shape[1],:shape[2],:shape[3]],(shape[0],shape[1]))).transpose()
time.sleep(2)
b.append(d)

这就解决了问题。

现在,原因是什么:在每次迭代中,您从文件中加载 l,在其中的一部分隐式创建一个 view (d ), 并将此 View 添加到 b。 View 实际上包含对整个数组的引用。所以每次,你加载整个数组并存储一个对象引用它,从而禁用垃圾收集器释放内存。

如果出于某种原因每次都必须重新加载文件,另一种解决方案是显式制作副本以丢失对整个数组的引用。在您的示例中,将最后一行替换为:

b.append(d.copy())

注意 1:实际上,因为 View ​​d 的大小与 l 相比可以忽略不计,所以您应该始终复制一份

注意 2:要断言 d 保留对 l 的引用,您可以这样做

d.base.base.base is l # True

.base 是对查看数组的引用。在您的情况下,有 3 个深度:l[...] 切片、 reshape 和转置。

关于python - 如何使用大阵列来防止大量使用 RAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22808656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com