我怎样才能把一个大的多维数组分次写入HDF5文件?
我正在使用C#中的HDF5DOTNET,并且我有一个非常大的数组(几个GB),我想写入HDF5文件.将整个内容存储在内存中太大了,所以我一次生成它的区域并想将它们写出来,但是当它被读出时,它看起来仍然像一个大数组.我知道使用HDF5这是可能的,但是.NET API的文档有些稀疏. 我编写了一些简短的示例代码,其中有一个5 x 3的数组,里面充满了值1..15: const int ROWS = 5; const int COLS = 3; static void Main(string[] args) { WriteWholeArray(); WriteArrayByRows(); ushort[,] array = ReadWholeArray(); } static void WriteWholeArray() { H5FileId h5 = H5F.create(Path.Combine(Environment.GetFolderPa
14 2024-04-22
编程技术问答社区
HDF5示例代码
使用 hdf5dotnet ,任何人都可以指向我指向示例代码吗?数据集并将内容打印到标准输出? 到目前为止,我有以下内容: H5.Open(); var h5 = H5F.open("example.h5", H5F.OpenMode.ACC_RDONLY); var dataset = H5D.open(h5, "/Timings/aaPCBTimes"); var space = H5D.getSpace(dataset); var size = H5S.getSimpleExtentDims(space); 然后有点混乱. 我实际上想对数据集的内容进行一些处理,但是我认为一旦转储到标准输出,我就可以从那里进行处理. 更新:我已经围绕着这个足以解决自己的问题.我未能意识到数据集是一个多阵列 - 我认为这更像是DB表.在不太可能的情况下,任何人都有兴趣, double[,]
10 2024-04-12
编程技术问答社区
HDF5:如何将数据追加到数据集上(可扩展阵列)
通过关注 tutorial 我VE试图扩展我的HDF5数据集.代码为以下内容,但是数据未正确写入数据集(数据集具有正确的最终大小,但仅包含零).与教程的唯一区别是我必须使用动态数组.有什么想法吗? int main() { hsize_t dims[1], max_dims[1], newdims[1], chunk_dims[1], offset[1]; hid_t file, file_space, plist, dataset, mem_space; int32_t *buffer1, *buffer2; file = H5Fcreate("test.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); // Create dataspace with initial dim = 0 and final = UNLIMITED dims[0] = 0; max_dims
8 2024-04-08
编程技术问答社区
如何在Python中直接上传HDF5文件到S3桶中
我想上传一个使用H5PY创建的HDF5文件,然后使用Boto3在本地保存. 解决方案使用泡菜.转储和泡菜.负载和我发现的其他解决方案,请在本地存储我喜欢避免的文件. 解决方案 您可以使用 6 .希望这可以帮助.即使在这种情况下,您也必须在本地"存储"数据(尽管"内存").您也可以创建一个 tempfile.TemporaryFile tempfile.TemporaryFile 用/a>.我认为您无法将流 到S3存储桶中,因为将本地数据上传到存储桶时会被丢弃.
14 2024-04-03
编程技术问答社区
写一个boost::multi_array到hdf5数据集
是否有任何可用于制作C ++向量的库或标题 我已经查看了HDF5 C ++示例,他们只使用C ++语法来调用C函数,而他们仅将静态C数组写入其数据集(请参阅Create.cpp). 我错过了重点!? 非常感谢 亚当 解决方案 这是在HDF5格式中写入n维multi_array s的方法 这是一个简短的例子: #include using boost::multi_array; using boost::extents; // allocate array int NX = 5, NY = 6, NZ = 7; multi_array float_data(extents[NX][NY][NZ]); // initialise the array for (int ii = 0; ii != NX; ii++) for (int jj = 0; jj != NY; jj+
14 2024-04-02
编程技术问答社区
评估HDF5:HDF5为数据建模提供了哪些限制/功能?
我们正在评估我们将用于存储在C/C ++代码分析过程中收集的数据的技术.在C ++的情况下,数据量可能相对较大,〜20mb/tu. 阅读以下内容后,/a>它让我考虑到 性能.数据的一般用法将进行一次编写并读取"几次",类似于编译器生成的" .o'文件的寿命". HDF5如何与使用SQLite DB之类的东西进行比较?这甚至是合理的比较吗? 随着时间的流逝,我们将添加到我们正在存储的信息中,但不一定要重新分发一组全新的"读者"集以支持新格式.阅读了用户指南后,我了解HDF5与XML或DB相似,因为该信息与标签/列相关联,因此构建的用于读取较旧结构的工具只会忽略与其无关的字段?我对这个正确的理解吗? 我们希望写出的很大一部分信息是结构的树类型:范围层次结构,类型层次结构等.理想情况下,我们将模拟范围为父母,孩子等一个HDF5对象"点"到另一个?如果没有,是否存在使用HDF5解决此问题的标准技术?或者,按照数据库的要求,我们是否需要一个唯一的密钥,在搜索数据时,可以将一个对
34 2024-03-30
编程技术问答社区
h5py写作。如何有效地将数以百万计的.npy数组写入一个.hdf5文件?
我必须将大图的子样本存储为.npy大小的阵列(20,20,5).为了在训练分类模型时均匀采样,我正在寻找一种有效的方式来存储近1000万个子示例,以此可以允许这种情况. 如果我将它们存储为整个图像,则在培训期间的采样将无法代表分布.我有存储空间,但我会用尽indodes,试图存储许多"小"文件. H5PY/写入HDF5文件是我问题的自然答案,但是该过程非常缓慢.一天半运行程序没有足够的时间来编写所有子样本.我是H5PY的新手,我想知道是否有太多写作是原因. 如果是这样,我不确定如何正确切碎,以免避免采样不均匀.每个图像都有不同数量的子样本(例如,一个图像可能是(20000,20,20,5),另一个图像可能是(32123,20,20,5). 这是我用来将每个示例写入.hdf5的代码: #define possible groups groups=['training_samples','validation_samples','test_samples'] f =
12 2024-03-30
编程技术问答社区
将hdf5转换为csv或tsv文件
我正在寻找可以将.H5文件转换为CSV或TSV的示例代码. 我必须阅读.h5,输出应为csv或tsv. 样本代码将不胜感激,请帮助我在过去的几天里一直坚持下去.我遵循包装班级,但不知道该如何使用.我不是一个好的程序员,所以面对很多问题. 请帮忙 预先感谢 解决方案 使用pandas. 的另一种python解决方案 #!/usr/bin/env python3 import pandas as pd import sys fpath = sys.argv[1] if len(sys.argv)>2: key = sys.argv[2] df = pd.read_hdf(fpath, key=key) else: df = pd.read_hdf(fpath) df.to_csv(sys.stdout, index=False) This script is available here 对此Scrpt的第一个参数是HDF5文件.如果
30 2024-03-30
编程技术问答社区
大数据上的增量PCA
我刚刚尝试使用Sklearn.decomposition中的EzrementAlpca,但它像PCA和随机PCA一样抛出了MemoryError.我的问题是,我试图加载的矩阵太大,无法适应RAM.现在,它存储在HDF5数据库中,作为Shape〜(1000000,1000)的数据集,因此我有1.000.000.000 Float32值.我认为增量为批次加载数据,但显然它试图加载整个数据集,这无济于事.该库是如何使用的? HDF5是否格式化问题? from sklearn.decomposition import IncrementalPCA import h5py db = h5py.File("db.h5","r") data = db["data"] IncrementalPCA(n_components=10, batch_size=1).fit(data) Traceback (most recent call last): File "", line 1
24 2024-03-30
编程技术问答社区
添加存储在HDF5数据集中的大矩阵
我有两个HDF5文件具有相同的结构,每个商店都有相同形状的矩阵.我需要创建第三个HDF5文件,其中代表上述两个矩阵的元素总和.鉴于矩阵的尺寸极大(在GB-TB范围内),最好以平行方式进行最佳方法?我正在使用H5PY接口到HDF5库.有没有能够执行此操作的库? 解决方案 是的,这是可能的.关键是要访问File1&File2的数据切片,按照您的元素为单位,然后将该新数据片写入File3.您可以使用H5PY或PYTABLE(又称表)来执行此操作.无需其他库.我只有并行计算的知识.我知道H5PY通过MPI4Py Python软件包支持MPI接口.详细信息:这是一个简单的示例.它使用随机浮点的数据集创建2个文件,shape=(10,10,10).然后,它可以创建一个具有相同形状的空数据集的新文件.循环读取来自file1和file2的数据片,总结它们,然后在file3中写入同一切片.要使用大数据进行测试,您可以修改形状以匹配您的文件. 21- JAN-2021更新: 我添加了代码以从Fi
4 2024-03-07
编程技术问答社区
如果dtype是"<u4",如何在python 3.6中从hdf5文件中获取数据数组?
我想从HDF5文件中获取具有格式{n,16,512,128}的数据集. n是{16,512,128}格式的3D数组. 我尝试这样做: import os import sys import h5py as h5 import numpy as np import subprocess import re file_name = sys.argv[1] path = sys.argv[2] f = h5.File(file_name, 'r') data = f[path] print(data.shape) #{27270, 16, 512, 128} print(data.dtype) #"
22 2024-03-06
编程技术问答社区
为什么我只有在不修复HDF5弃用警告时才能处理大文件?
收到H5pyDeprecationWarning: dataset.value has been deprecated. Use dataset[()] instead. a>,我将代码更改为: import h5py import numpy as np f = h5py.File('myfile.hdf5', mode='r') foo = f['foo'] bar = f['bar'] N, C, H, W = foo.shape. # (8192, 3, 1080, 1920) data_foo = np.array(foo[()]) # [()] equivalent to .value 当我尝试阅读(不是这样)的大图像文件时,我在终端上得到了一个Killed: 9,我的过程被杀死了,因为它消耗了太多的记忆,尽管在代码的最后一行,但我那里的那个古老评论. . 但是,我的原始代码: f = h5py.File('myfile.hdf5', mode='r
26 2024-03-06
编程技术问答社区
读取嵌套的.h5组到numpy数组中
我从朋友那里收到了此.H5文件,我需要将其中的数据用于某些工作.所有数据都是数值的.这是我第一次使用这类文件.我在这里发现了许多有关阅读这些文件的问题和答案,但是我找不到一种方法来降低文件包含的组或文件夹的较低级别. 该文件包含两个主要文件夹,即x和y X包含一个名为0的文件夹,其中包含两个名为A和B的文件夹. Y包含十个名为1-10的文件夹. 我想阅读的数据在A,B,1,2,..,10 例如,我从 开始 f = h5py.File(filename, 'r') f.keys() 现在f返回 [u'x',u'y'] 两个主要文件夹 然后,我尝试使用read_direct读取x和y,但我得到了错误 attributeError:'组'对象没有属性'read_direct' 我尝试为x和y创建一个对象,如下所示 obj1 = f['X'] obj2 = f['Y'] 然后,如果我使用命令 obj1.shape obj1.dtype 我有一个错
8 2024-03-05
编程技术问答社区
使用不同大小的h5py数组进行保存
我正在尝试使用HDF5数据格式存储大约3000个Numpy阵列.阵列的长度从5306到121999 NP.Float64 我得到了 Object dtype dtype('O') has no native HDF5 equivalent 错误,因为由于数据的不规则性质,numpy使用了一般对象类. 我的想法是将所有阵列添加到121999的长度并将大小存储在另一个数据集中. 但是,这似乎在空间上效率很低,有更好的方法吗? 编辑:要澄清,我想存储3126个dtype = np.float64的阵列.我将它们存储在list中,当H5Py执行例程时,它会转换为dtype = object的数组,因为它们的长度不同.为了说明: a = np.array([0.1,0.2,0.3],dtype=np.float64) b = np.array([0.1,0.2,0.3,0.4,0.5],dtype=np.float64) c = np.array([0.1,0.2],
8 2024-03-04
编程技术问答社区
在Hdf5文件中用C++编写和追加浮点数组到唯一的数据集上
我正在处理文件数量,文件的每个处理都将输出数千个阵列的浮点数,我将将所有文件的数据存储在一个巨大的数据集中. 目前,我对如何将数据附加到HDF5文件中感到困惑. (在上面的代码中评论)在上面的循环中,您要看到的,我想一次将1维浮标的浮点数附加到HDF5中,而不是整个过程.我的数据是在trabytes中,我们只能将数据附加到文件中. 有几个问题: 在这种情况下如何附加数据?我必须使用哪种功能? 现在,我有FDIM [0] = 928347543,我尝试将HDF5的Infinity Flag放入中,但是运行时执行会抱怨.有没有办法做到这一点?我不想计算每次都有的数据;有没有一种方法可以简单地继续添加数据,而不必关心fdim的价值? 还是不可能? 编辑: 我一直在遵循西蒙的建议,目前是我的更新代码: hid_t desFi5; hid_t fid1; hid_t propList; hsize_t fdim[2]; desFi5 = H5Fcrea
8 2024-03-04
编程技术问答社区
是否可以用python将磁盘上的不连续数据映射到阵列中?
我想将硬盘上的大型福特兰记录(12G)映射到numpy数组. (映射而不是加载以保存内存.) 存储在fortran记录中的数据不连续,因为它被记录标记划分.记录结构为"标记,数据,标记,数据,...,数据,标记".数据区域和标记的长度是已知的. 标记之间的数据长度不是4个字节的倍数,否则我可以将每个数据区域映射到数组. 可以通过在memmap中设置偏移来跳过第一个标记,是否可以跳过其他标记并将数据映射到数组? 道歉可能歧义表达,并感谢您的任何解决方案或建议. 编辑5月15日 这些是Fortran的未形式的文件.记录中存储的数据是(1024^3)*3 float32数组(12GB). 可变长度记录的记录布局大于2 g,如下所示: (For details see there - > - > e节[记录类型] - > [varible-length Records].) ) 在我的情况下,除了最后一个,每个子记录的长度为21474836
14 2024-03-04
编程技术问答社区
如何压缩hdf5中的列表/嵌套列表
我最近了解了HDF5压缩并使用它.在使用巨型文件时,它比.npz/npy具有一些优势. 我设法尝试了一个小列表,因为有时我会使用具有如下字符串的列表; ; def write(): test_array = ['a1','a2','a1','a2','a1','a2', 'a1','a2', 'a1','a2','a1','a2','a1','a2', 'a1','a2', 'a1','a2','a1','a2','a1','a2', 'a1','a2'] with h5py.File('example_file.h5', 'w') as f: f.create_dataset('test3', data=repr(test_array), dtype='S', compression='gzip', compression_opts=9) f.close() 但是我有一个错误: f.create
14 2024-03-04
编程技术问答社区
如何用M1在MacOS上安装h5py(Keras所需)?
我有一个M1 MacBook.我使用Pyenv安装了Python 3.9.1,并具有PIP3版本21.0.1. 我已经通过brew install hdf5安装了Homebrew和HDF5 1.12.0_1. 当我键入 时 pip3 install h5py 我得到错误: 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: Unabl
6 2024-03-02
编程技术问答社区
在HDF5中删除或更新一个数据集?
我想在编程中更改与HDF5文件中数据集关联的数据.我似乎找不到通过名称删除数据集的方法(允许我在修改后的数据中再次添加它),也可以按名称更新数据集.我正在为HDF5 1.6.x使用C API,但对任何HDF5 API的指示都会有用. 解决方案 根据用户指南: HDF5目前尚未提供一种简单的机制,可以从文件中删除数据集或收回已删除对象占用的存储空间. 如此简单的删除似乎是不可能的.但是该部分继续: 可以使用H5Ldelete函数删除数据集并收回所使用的空间,而 h5repack 实用程序程序.使用H5Ldelete函数,可以从文件结构中删除指向数据集的链接.删除所有链接后,数据集将无法访问任何应用程序,并有效地从文件中删除.恢复由未链接数据集占据的空间的方法是将文件的所有对象写入新文件中.应用程序无法访问任何未链接对象,并且不会包含在新文件中.可以使用自定义程序或 h5repack 实用程序程序编写对象. 其他解决方案 如果要删除C ++中的数据集,则需要
98 2024-03-01
编程技术问答社区