Python:创建3D数组时的Numpy内存错误.填充3D阵列的更好方法是什么?



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

x_train_one_hot形状为(47827,30,20000),并且结合形状为(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 a One_hot编码20000 size size

imtinan azhar是正确的。您根本没有足够的RAM容纳数组。

您有一些选择。

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

如果将数组扔进库中的库中,例如Scikit-Learn或其中一个深度学习库,则可能不起作用。

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

3)如果这些都是不可能的,那么您可以尝试使用Numpy的Memmap来记忆映射数组。可以在此处找到一些进一步的示例。

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

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

让我们查看您的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,我认为形状20200是错别字,查找

最新更新