我有一个庞大的无线电信号数据集(deepsig data set 2018),其组织如下:
数据集是一个具有3个键(X,Y,Z)的.hdf5文件
over 2 Millions sample each has 1024 complex points (2 floats for real and imaginary parts)
我将调制类型和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
所以,我的问题是:
答案 0 :(得分:1)
假定数据类型为32位浮点数,则整个阵列在内存中的大小约为20 GB,因此您的RAM可以容纳整个阵列的一个副本,但不能容纳两个副本。我的猜测是,当您使用vstack
创建第一个副本后,X = f['X'][:]
创建了该数组的另一个内存中副本时,就会发生MemoryError。问题不是vstack
对大型数组不起作用,而是您尝试一次处理内存中的整个大型数组。
回答您的问题:
X_shaped = np.swapaxes(X, 1, 2)
,这将解决问题,因为它会创建一个重塑的视图而不是副本,但是您很可能最终会在稍后的代码中遇到内存问题。f['X'][:,:512,:]
。但是:那个庞大的数据集存在于HDF5文件中是有原因的。 HDF5使您可以方便地对数据进行切片,而无需先将整个内容加载到内存中,然后再使用numpy对其进行操作。在数据评估中,通常会遍历数据。