有没有办法vstack()一个非常大的数组

时间:2019-08-05 14:37:01

标签: python-3.x numpy

我有一个庞大的无线电信号数据集(deepsig data set 2018),其组织如下:

数据集是一个具有3个键(X,Y,Z)的.hdf5文件

  • X:shape(2 555 904 x 1024 x 2)漂浮over 2 Millions sample each has 1024 complex points (2 floats for real and imaginary parts)
  • Y:指向调制类型的整数(形状为2 555 904 x 24)
  • Z:shape(2 555 904 x 1)为信号噪声电平(SNR)的整数

我将调制类型和SNR组织为元组((mod,snr),(mod,snr),(mod,snr), ...)

的列表

我的问题是,当我提取X数据并尝试垂直组织它们时,我遇到了内存问题(尽管我有32GB RAM,但无法分配足够的内存)。这是我的代码:

import h5py
import numpy as np

filename = 'RML_2018.hdf5'
f = h5py.File(filename, 'r')

X = f['X'][:]
X = np.vstack(X)
print (X.shape)

这是错误:

Traceback (most recent call last):
  File "/home/nechi/PycharmProjects/CNN_MR_v2/cnn.py", line 11, in <module>
    X = np.vstack(X)
  File "<__array_function__ internals>", line 6, in vstack
  File "/home/nechi/PycharmProjects/CNN_MR_v2/venv/lib/python3.6/site-packages/numpy/core/shape_base.py", line 282, in vstack
    return _nx.concatenate(arrs, 0)
  File "<__array_function__ internals>", line 6, in concatenate
numpy.core._exceptions.MemoryError: Unable to allocate array with shape (2617245696, 2) and data type float32

所以,我的问题是:

  1. 是否有可能解决此内存问题?
  2. 如果我想减少数据(例如,以512个样本代替1024个样本),您是否知道该怎么做?

1 个答案:

答案 0 :(得分:1)

假定数据类型为32位浮点数,则整个阵列在内存中的大小约为20 GB,因此您的RAM可以容纳整个阵列的一个副本,但不能容纳两个副本。我的猜测是,当您使用vstack创建第一个副本后,X = f['X'][:]创建了该数组的另一个内存中副本时,就会发生MemoryError。问题不是vstack对大型数组不起作用,而是您尝试一次处理内存中的整个大型数组。

回答您的问题:

  1. 您可以使用X_shaped = np.swapaxes(X, 1, 2),这将解决问题,因为它会创建一个重塑的视图而不是副本,但是您很可能最终会在稍后的代码中遇到内存问题。
  2. 只需按照@hpaulj的建议使用f['X'][:,:512,:]

但是:那个庞大的数据集存在于HDF5文件中是有原因的。 HDF5使您可以方便地对数据进行切片,而无需先将整个内容加载到内存中,然后再使用numpy对其进行操作。在数据评估中,通常会遍历数据。