我正在制作一个零的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编码,因此大多数数组都是稀疏的
答案 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形状是一个错字,请查找