Python:创建3d数组时出现Numpy内存错误。什么是填充3D数组的更好方法

时间:2019-02-28 10:04:54

标签: python arrays numpy

我正在制作一个零的3d数组,然后填充它。但是,由于numpy数组的大小,即使使用64 GB RAM,它也会遇到内存问题。我做错了吗?

  

X_train_one_hot形状为(47827,30,20000),encInput形状为(47827,30,200)

X_train_one_hot_shifted = np.zeros((X_train_one_hot.shape[0], 30, 20200))
#X_train_one_hot.shape[0] = 48000
for j in range(0, X_train_one_hot.shape[0]):
    current = np.zeros((30, 20000))
    current[0][0] = 1

    current[1:] = X_train_one_hot[j][0:29]
#     print(current.shape, encInput[i].shape)
    combined = np.concatenate((current,encInput[j]), axis=1)

    X_train_one_hot_shifted[j] = combined

有什么减少内存消耗的想法吗?另一个有趣的事情是,由于X_train_one_hot的形状也几乎相同,但这不会引发任何错误。

编辑:该程序在for循环中被杀死,并显示错误消息:

  

TERM_MEMLIMIT:作业在达到LSF内存使用量限制后被杀死。

此外,由于X_train_one_hot 20000大小的one_hot编码,因此大多数数组都是稀疏的

2 个答案:

答案 0 :(得分:2)

Imtinan Azhar是正确的。您根本没有足够的RAM来容纳阵列。

您有一些选择。

1)即使大小很大,您似乎也有一个非常稀疏的矩阵。因此,您可以尝试使用Scipy中的sparse matrix representation之一。

如果将阵列放入Scikit-Learn之类的库程序包或其中一个深度学习库中,则可能无法正常工作。

2)大多数DL库不需要您一次加载所有数据。您可以分批准备数据-批量创建此矩阵并将其保存到文件中(最好使用稀疏矩阵表示形式)。然后,使用数据生成器来填充您的算法,或者手动为算法批量加载数据。

3)如果所有这些都不可行,则可以尝试使用Numpy的memmap对数组进行内存映射。可以找到其他一些示例here

4)另一种选择是使用dask并在必要时手动获取数据切片。

就个人而言,如果您采用矩阵的算法可以处理(或修改为处理)稀疏矩阵,那么我会选择选项2或1。

答案 1 :(得分:1)

让我们看看您的X_train_one_hot_shifted.shape是(48000,30,20200),即28983162000浮点数。

28983162000*8为您提供此数组的内存消耗(以字节为单位)。 231865296000个字节

让我们简化一下

231865296000 b

226430953.125 kb

221123.977661 mb

215.941384435 gb

您需要215Gb RAM才能将X_train_one_hot_shifted放入RAM中,我认为20200形状是一个错字,请查找