大小为2GB的数组会在减法和除法运算时抛出内存错误

时间:2017-12-12 15:15:51

标签: python numpy memory

我已经加载了大约2gb的numpy数组,当我尝试规范化其条目时出现内存错误:

 import numpy as np
 fX = 'train_X.npy'
 imgs = np.load(fX)
 #normalize
 X = (imgs - 128.)
 X = X / 255.

X包含10000个rgb图像,因此它的形状(10012,210,320,3)和X.bytes返回2018419200.我正在使用Ubuntu服务器发行版(谷歌云),可用14GB的ram,python和numpy在64位,所以我真的没有看到这个问题......有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您的数组imgs的类型为uint8,每个条目占用一个字节的内存。因此该阵列占用2018419200字节,大约1.88 GB。

减去128.(一个浮点数)将数组转换为float64(双精度浮点数),每个数字需要8个字节。这使得大小为15 GB,因此导致内存错误。

您可以通过将数组转换为单精度来保存情况,float32将占用一半的空间(7.5 GB)。

X = np.load(fX).astype(np.float32)
X -= 128.
X /= 255.

增强的赋值操作是就地完成的,因此不会创建中间副本。

您也可以尝试float16类型(请参阅所有data types),但许多NumPy / SciPy方法都需要浮点数或浮点数32,因此您最终可能会得到更大的数组。

(另一个选择是将数组保持为uint8并找出如何在不进行规范化和相关转换为浮点数的情况下执行您想要执行的操作。)