python-3.x - 有没有办法 vstack() 一个非常大的数组
问题描述
我有一个庞大的无线电信号数据集(deepsig data set 2018),其组织如下:
数据集是一个具有 3 个键(X、Y、Z)的 .hdf5 文件
- X:形状(2 555 904 x 1024 x 2)浮动
over 2 Millions sample each has 1024 complex points (2 floats for real and imaginary parts)
- Y : shape(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
所以,我的问题是:
- 有没有办法解决这个内存问题?
- 如果我想减少数据(例如取 512 个样本而不是 1024 个样本),你知道怎么做吗?
解决方案
假设数据类型是 32 位浮点数,整个数组在内存中大约有 20 GB,因此您的 RAM 可以保存整个数组的一个副本,但不能保存两个。我的猜测是,您的 MemoryError 发生vstack
在您使用X = f['X'][:]
. 问题不在于它vstack
不适用于大型数组,而是您尝试一次处理内存中的整个巨大数组。
回答您的问题:
- 您可以使用
X_shaped = np.swapaxes(X, 1, 2)
,这将解决此时的问题,因为它会创建一个重新调整的视图而不是副本,但您可能最终会在代码的后面遇到内存问题。 - 只需
f['X'][:,:512,:]
按照@hpaulj 的建议使用。
但是:这个庞大的数据集在 HDF5 文件中是有原因的。HDF5 让您可以方便地对数据进行切片,而无需先将整个数据加载到内存中,然后再使用 numpy 对其进行操作。在您的数据评估中,您通常会迭代您的数据。
推荐阅读
- google-drive-api - 如何通过 API 将 pptx 文件转换为 Google 幻灯片演示文稿?
- http - 如何使用 golang 服务器检查隐式设置的 http 标头?
- linux - 删除进程的 RT prio
- asp.net-mvc - 检查 Azure 作业的整体进度并将其发送到 ASP.NET 视图
- laravel - 如何挂钩 laravel nova 中资源的删除事件?
- laravel - CamelCase 类型控制器的视图文件夹的命名约定是什么
- php - 我的 Unicode 保护方案是否完整?是否有保护 Unicode 字符串的内置方法?
- html - 如何从带有空格的图像名称中删除+号
- moodle - 成功用户登录后moodle无效响应
- json - 如何使用 mongo-go-driver 有效地将 bson 转换为 json?