首页 > 解决方案 > 有没有办法 vstack() 一个非常大的数组

问题描述

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

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

我将调制类型和 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 个样本),你知道怎么做吗?

标签: python-3.xnumpy

解决方案


假设数据类型是 32 位浮点数,整个数组在内存中大约有 20 GB,因此您的 RAM 可以保存整个数组的一个副本,但不能保存两个。我的猜测是,您的 MemoryError 发生vstack在您使用X = f['X'][:]. 问题不在于它vstack不适用于大型数组,而是您尝试一次处理内存中的整个巨大数组。

回答您的问题:

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

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


推荐阅读