当我使用NumPy时,我以本机格式*.npy存储它的数据。它非常快,给了我一些好处,就像这个
现在我正在与HDF5 (目前的PyTables)打交道。当我在本教程中阅读时,他们使用NumPy序列化程序来存储NumPy数据,这样我就可以像从简单的*.npy文件一样从C中读取这些数据了吗?
HDF5 5的numpy与C结构也是二元兼容的吗?
UPD:
我有matlab客户端从hdf5读取数据,但不想从C++读取hdf5,因为从*.npy读取二进制数据要快得多,所以我确实需要从C++读取hdf5 (二进制兼容性),所以我已经使用了两种传输数据的方法-- *.npy (从*.npy作为字节读取,从Python本地读取)和hdf5 (从Matlab访问),如果可能的话,只想使用一种方法-- hdf5,但要做到这一点,我必须找到一种方法,使hdf5与C++结构兼容,请帮助,如果有什么方法可以关闭hdf5中的压缩,或者使hdf5二进制(与C++结构兼容),告诉我在哪里可以读到它.
发布于 2010-11-10 00:57:51
我感觉到你的痛苦。我一直在大量处理存储在HDF5格式文件中的大量数据,并且收集了一些您可能认为有用的信息。
如果您处于文件创建的“控制”(并编写数据--即使您使用API),那么您应该能够在很大程度上完全绕过HDF5库。
如果未对输出数据集进行分块,则它们将被连续写入。只要您没有在数据类型定义中指定任何字节顺序转换(也就是说,您指定的数据应该以本机浮点数/双/整数格式编写),您就应该能够实现“二进制兼容性”。
为了解决我的问题,我使用文件规范http://www.hdfgroup.org/HDF5/doc/H5.format.html编写了一个http://www.hdfgroup.org/HDF5/doc/H5.format.html文件解析器。
使用相当简单的解析器,您应该能够识别任何数据集的偏移量(和大小)。在这一点上,只需寻找和阅读(在C中,也就是说,也许有一个更高层次的方法,您可以在C++中采取)。
如果您的数据集是块的,那么需要更多的解析来遍历用于组织块的b-树。
您应该注意的唯一其他问题是处理任何(或消除)任何依赖于系统的结构填充。
发布于 2010-11-09 12:22:06
从C中读取hdf5文件的正确方法是使用hdf5 API --参见此tutorial。原则上,可以像对hdf5文件一样直接从.npy文件读取原始数据,前提是您没有使用高级存储选项,比如在hdf5文件中进行压缩。然而,这在本质上违背了使用hdf5格式的全部意义,我认为这样做不使用适当的hdf5 API有什么好处。还请注意,API有一个simplified high level version,它可以使从C读取相对轻松。
发布于 2015-05-03 01:56:46
HDF5为您处理结构的二进制兼容性。您只需告诉它您的结构由什么组成(dtype),并且保存/读取记录数组没有问题--这是因为类型系统在numpy和HDF5之间基本上是1:1。如果使用H5py,我可以肯定地说,只要使用所有本机类型和大批读写(允许的整个数据集),IO就应该足够快。在此之后,它取决于分块和什么过滤器(例如洗牌、压缩)--有时还值得注意的是,这些过滤器可以通过大幅度减少文件大小来加快速度,所以始终关注基准测试。注意,类型和筛选器的选择是在创建HDF5文档的末尾进行的。
如果您试图自己解析HDF5,那么您就错了。如果您在C++/C中工作,可以使用C++和apis。在HDF5组网站上有所谓的“复合类型”的例子。
https://stackoverflow.com/questions/4133327
复制相似问题