【问题标题】:Python : Numpy memory error on creating a 3d array. Whats the better way to fill a 3d arrayPython:创建 3d 数组时出现 Numpy 内存错误。什么是填充 3d 数组的更好方法
【发布时间】:2019-02-28 19:07:46
【问题描述】:

我正在制作一个 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 编码

【问题讨论】:

  • 您能否也分享确切的内存错误,以及在执行的哪个时间点您收到错误?我假设这是一个错误而不是崩溃。
  • @fountainhead - 我的错。应该添加它。由于内存不足,它崩溃了。我已经更新了详细信息

标签: python arrays numpy


【解决方案1】:

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

你有几个选择。

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

如果您将数组放入库包中,例如 Scikit-Learn 或其中一个深度学习库,这可能不起作用。

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

3) 如果这些都不可能,那么您可以尝试使用 Numpy 的 memmap 对数组进行内存映射。可以在here 找到更多示例。

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

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

【讨论】:

  • 不 numpy 使用虚拟内存,超过 RAM 容量?或者我们是说这里甚至超出了虚拟内存?
  • 是的,我认为第二个选项更好。
  • @fountainhead 我不太明白你在说什么。操作系统始终使用虚拟内存寻址,但内存受物理 RAM 和交换文件的限制。根据操作系统,即使仍有可用的物理 RAM,它也可以将数据放入交换文件中。此外,一个进程可能对它可以使用的最大 RAM 量有一个上限(例如,由 ulimit 设置)。然后有一种情况,操作系统确定即使交换文件也会用完空间,所以它会杀死进程。最后,即使交换文件中有可用空间,在磁盘中交换这么多数据也可能会导致磁盘垃圾。
  • @lightalchemist:我的问题更多,而不是 stmt。是的,所有这些情况确实存在。促使我询问虚拟内存的原因是,答案似乎只是将程序要求与 RAM 大小进行比较,甚至没有考虑是否配置了虚拟内存以及配置了多少虚拟内存(是的,是否配置了每个进程的限制以及配置了多少) )。也许,答案的主要重点是建议解决方法。:-)
【解决方案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 放入您的 RAM,我认为形状 20200 是一个错字,请查一下

【讨论】:

  • 感谢您的回答。形状是 20200,因为我正在连接另一个数组。但是,形状和 X_train_one_hot 差不多,大小一样,不会报错
  • 它应该会引发内存错误,但无论如何,数组太大而无法放入您的 RAM
  • 不numpy使用虚拟内存,超过RAM容量?
猜你喜欢
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 2011-04-12
  • 2016-08-08
  • 1970-01-01
相关资源
最近更新 更多