我有一个Python代码,其输出是一个 size矩阵,其条目都是类型
float
.如果我使用扩展名保存它,.dat
文件大小约为500 MB.我读到使用h5py
大大减少了文件大小.所以,假设我有名为的2D numpy数组A
.如何将其保存到h5py文件?另外,我如何读取相同的文件并将其作为一个numpy数组放在不同的代码中,因为我需要对数组进行操作?
我正在处理大型3D阵列,我经常需要以各种方式进行切片以进行各种数据分析.典型的"立方体"可以是~100GB(将来可能会变大)
似乎python中大型数据集的典型推荐文件格式是使用HDF5(h5py或pytables).我的问题是:使用HDF5存储和分析这些立方体而不是将它们存储在简单的平面二进制文件中是否有任何速度或内存使用效益?HDF5是否更适合表格数据,而不像我正在使用的大型数组?我看到HDF5可以提供很好的压缩,但我对处理速度和处理内存溢出更感兴趣.
我经常只想分析立方体的一个大的子集.pytables和h5py的一个缺点是,当我拿一个数组时,我总是得到一个numpy数组,用尽内存.但是,如果我切片平面二进制文件的numpy memmap,我可以得到一个视图,它将数据保存在磁盘上.因此,似乎我可以更轻松地分析我的数据的特定部分而不会超出我的记忆.
我已经探讨了pytables和h5py,到目前为止还没有看到我的目的的好处.
我做了很多统计工作,并使用Python作为我的主要语言.我使用的一些数据集虽然可以占用20GB的内存,但这使得使用numpy,scipy和PyIMSL中的内存函数对它们进行操作几乎是不可能的.统计分析语言SAS在这里具有很大的优势,因为它可以对来自硬盘的数据进行操作而不是严格的内存处理.但是,我想避免在SAS中编写大量代码(出于各种原因),因此我试图确定我使用Python的选项(除了购买更多的硬件和内存).
我应该澄清一下像map-reduce这样的方法对我的大部分工作都无济于事,因为我需要对完整的数据集进行操作(例如计算分位数或拟合逻辑回归模型).
最近我开始玩h5py并认为这是我发现允许Python像SAS一样操作磁盘上的数据(通过hdf5文件),同时仍然能够利用numpy/scipy/matplotlib等的最佳选择.我想听听是否有人在类似设置中使用Python和h5py以及他们发现了什么.有没有人能够在迄今为止由SAS主导的"大数据"设置中使用Python?
编辑:购买更多硬件/内存当然可以提供帮助,但从IT角度来看,当Python(或R或MATLAB等)需要在内存中保存数据时,我很难将Python出售给需要分析大量数据集的组织.SAS继续在这里有一个强大的卖点,因为虽然基于磁盘的分析可能会更慢,但您可以放心地处理大量数据集.因此,我希望Stackoverflow可以帮助我弄清楚如何降低使用Python作为主流大数据分析语言的感知风险.
我在Ubuntu服务器上安装h5py.但是它似乎返回了一个h5py.h
未找到的错误.当我使用pip
或setup.py
文件安装它时,它会给出相同的错误消息.我在这里错过了什么?
我有Numpy版本1.8.1,高于1.6或更高版本所需的版本.
完整输出如下:
van@Hulk:~/h5py-2.3.1? sudo python setup.py install
libhdf5.so: cannot open shared object file: No such file or directory
HDF5 autodetection failed; building for 1.8.4+
running install
running bdist_egg
running egg_info
writing h5py.egg-info/PKG-INFO
writing top-level names to h5py.egg-info/top_level.txt
writing dependency_links to h5py.egg-info/dependency_links.txt
reading manifest file 'h5py.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no files found matching '*.c' under directory 'win_include'
warning: no files found matching '*.h' under directory 'win_include'
writing manifest file 'h5py.egg-info/SOURCES.txt'
installing library …
Run Code Online (Sandbox Code Playgroud) 我有一台 M1 MacBook。我已经使用 pyenv 安装了 python 3.9.1,并且 pip3 版本为 21.0.1。我已经通过安装了自制程序和 hdf5 1.12.0_1 brew install hdf5
。
当我打字时
pip3 install h5py
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Requirement already satisfied: numpy>=1.19.3 in /Users/.../.pyenv/versions/3.9.1/lib/python3.9/site-packages (from h5py) (1.20.0)
Building wheels for collected packages: h5py
Building wheel for h5py (PEP 517) ... error
Loading library to get build settings and version: libhdf5.dylib
error: Unable to load dependency HDF5, make sure HDF5 is installed properly
error: dlopen(libhdf5.dylib, 6): image not found
----------------------------------------
ERROR: Failed building wheel for h5py
Run Code Online (Sandbox Code Playgroud)
我看到它libhdf5.dylib …
我正在尝试覆盖一个numpy数组,这是一个相当复杂的h5文件的一小部分.
我正在提取数组,更改一些值,然后想要将数组重新插入到h5文件中.
我没有问题提取嵌套的数组.
f1 = h5py.File(file_name,'r')
X1 = f1['meas/frame1/data'].value
f1.close()
Run Code Online (Sandbox Code Playgroud)
我尝试过的代码看起来像这样但没有成功:
f1 = h5py.File(file_name,'r+')
dset = f1.create_dataset('meas/frame1/data', data=X1)
f1.close()
Run Code Online (Sandbox Code Playgroud)
作为一个完整性检查,我使用以下代码在Matlab中执行此操作,并且它没有任何问题.
h5write(file1, '/meas/frame1/data', X1);
Run Code Online (Sandbox Code Playgroud)
有没有人对如何成功做到这一点有任何建议?
我正在寻找使用python(h5py)将数据附加到h5文件中的现有数据集的可能性.
我的项目简介:我尝试使用医学图像数据训练CNN.由于在将数据转换为nparrays期间需要大量数据和大量内存,我需要将"转换"拆分为几个数据块 - >加载并预处理前100个医学图像并将nparray保存到hdf5 file - >加载下一个100个数据集并附加现有的h5文件.
现在我尝试按如下方式存储前100个转换后的nparrays:
import h5py
from LoadIPV import LoadIPV
X_train_data, Y_train_data, X_test_data, Y_test_data = LoadIPV()
with h5py.File('.\PreprocessedData.h5', 'w') as hf:
hf.create_dataset("X_train", data=X_train_data, maxshape=(None, 512, 512, 9))
hf.create_dataset("X_test", data=X_test_data, maxshape=(None, 512, 512, 9))
hf.create_dataset("Y_train", data=Y_train_data, maxshape=(None, 512, 512, 1))
hf.create_dataset("Y_test", data=Y_test_data, maxshape=(None, 512, 512, 1))
Run Code Online (Sandbox Code Playgroud)
可以看出,转换后的nparray被分成四个不同的"组",存储在四个hdf5数据集[X_train,X_test,Y_train,Y_test]中.LoadIPV()函数执行医学图像数据的预处理.
我的问题是,我想将接下来的100个nparray存储到现有数据集中的同一个h5文件中:这意味着我想要附加例如现有的X_train-dataset [100,512,512,9]以及接下来的100个nparrays这样X_train变为[200,512,512,9].这同样适用于其他三个数据集X_test,Y_train,Y_test.
非常感谢您的帮助!
我有许多hdf5文件,每个文件都有一个数据集.数据集太大而无法容纳在RAM中.我想将这些文件组合成一个单独包含所有数据集的文件(即不将数据集连接成单个数据集).
一种方法是创建一个hdf5文件,然后逐个复制数据集.这将是缓慢而复杂的,因为它需要缓冲副本.
有更简单的方法吗?似乎应该有,因为它实际上只是创建一个容器文件.
我正在使用python/h5py.
我有一个字典,其中key是datetime对象,value是整数元组:
>>> d.items()[0]
(datetime.datetime(2012, 4, 5, 23, 30), (14, 1014, 6, 3, 0))
Run Code Online (Sandbox Code Playgroud)
我想将它存储在HDF5数据集中,但是如果我尝试只是转储字典h5py会引发错误:
TypeError:Object dtype dtype('object')没有等效的原生HDF5
什么是"最好"的方式来转换这个字典,以便我可以将它存储在HDF5数据集中?
具体来说,我不想只是将字典转储到numpy数组中,因为它会使基于日期时间查询的数据检索变得复杂.
我有一个包含三个数组的现有hdf5文件,我想使用h5py提取其中一个数组.