【问题标题】:Change data type of enormous HDF5 array in python在python中更改巨大HDF5数组的数据类型
【发布时间】:2020-03-20 17:39:46
【问题描述】:

我有 4 个 HDF5 文件,每个文件大小约为 15GB。每个都采用 N_i x 2048 x 7 x 7 的形式。每个都是 float64 格式。我想将它们合并到一个 float32 类型的 N x 2048 x 7 x 7 数据集。我已经阅读了 h5py 文档并且知道数据集的数据类型无法更改。

所以我唯一的想法就是

  1. 将所有文件转换为 numpy 数组。
  2. 合并数组。
  3. 从 float64 转换为 float32。
  4. 创建新数据集。

这种方法的明显问题是我只有 32GB 的 RAM,而且我无法将这些数组放入内存中。如何绕过这些限制?

【问题讨论】:

  • 你能不能一次只处理 1% 的数组,完成这项工作,写入 hdf5 文件,丢弃 1%,进入下一部分?
  • 理论上我可以做到这一点,你有关于我将如何实施的指示吗?我对 h5py 库的了解是初级的。
  • 我也不知道,但我认为将较小的数据集附加到现有文件(阅读this question)是绝对可行的,因此您应该能够初始化文件并在使用数组时进行扩展你去的部分。

标签: python large-files hdf


【解决方案1】:

首先,我同意,尝试将它们加载为numpy,然后更改 dtype 以获得一些内存。

import numpy as np
import h5py

hf = h5py.File('file.h5', 'r')
n1 = np.array(hf["dataset_name"][:])

print(n1)

如您所述,在第 3 步之后,如果您的系统内存不足,则没有解决方案如果您想一次加载所有内容。您需要找到一台具有足够内存的机器完成这项任务。

【讨论】:

  • 仍然 4 x 7.5 GB 危险地接近 32 GB 的限制。鉴于一些内存对于其他系统任务是必不可少的。
  • 这些数字似乎不对。 2048 * 10 * 10 * (8 bytes) = 0.0016384 gigabytes each -- 对于 float64
  • @makis 没有解决方案是什么意思?残酷地将所有数据加载到内存中并查看它是否有效并不是唯一的方法。处理数组的一小部分并将其写入文件怎么样?
  • 当然,我的意思是如果 OP 想要一次将所有内容加载到内存中。
  • @makis 它更像是 15000 * 2048 * 10 * 10 * (8 bytes)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 2013-08-02
  • 2017-07-08
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
相关资源
最近更新 更多