HDF5:存储NumPy数据

时间:2010-11-09 11:51:58

标签: python c numpy hdf5 pytables

当我使用NumPy时,我以原生格式* .npy存储了它的数据。它非常快,给了我一些好处,比如这个

  • 我可以从C代码中读取* .npy 简单的二进制数据(我的意思是* .npy是 二元兼容C结构)

现在我正在处理HDF5(PyTables此刻)。正如我在教程中读到的,他们使用NumPy序列化程序来存储NumPy数据,所以我可以从简单的* .npy文件中读取C中的这些数据吗?

HDF5的numpy是否也与C结构兼容?

UPD:

我有从hdf5读取matlab客户端,但不想从C ++读取hdf5因为从* .npy读取二进制数据的速度要快一些,所以我真的需要从C ++读取hdf5(二进制兼容性) 所以我已经使用两种方式传输数据 - * .npy(从C ++读取为字节,从本地Python读取)和hdf5(从Matlab访问) 如果有可能,想要使用唯一的方法 - hdf5,但为了做到这一点,我必须找到一种方法来使hdf5与C ++结构兼容,请帮助,如果有一些方法来关闭hdf5中的压缩或其他什么来使hdf5二进制兼容C ++结构 - 告诉我在哪里可以阅读它...

3 个答案:

答案 0 :(得分:9)

从C读取hdf5文件的正确方法是使用hdf5 API - 请参阅此tutorial。原则上,可以直接从hdf5文件中读取原始数据,就像使用.npy文件一样,假设您没有在hdf5文件中使用高级存储选项,例如压缩。然而,这基本上无视使用hdf5格式的全部意义,我不能想到这样做的任何优势,而不是使用正确的hdf5 API。另请注意,API有一个simplified high level version,这样可以使C读取相对轻松。

答案 1 :(得分:1)

我感觉到你的痛苦。我一直在广泛处理存储在HDF5格式文件中的大量数据,我已经收集了一些你可能会觉得有用的信息。

如果您正在“控制”文件创建(并编写数据 - 即使您使用API​​),您应该能够完全绕过HDF5库。

如果输出数据集没有分块,它们将被连续写入。只要您没有在数据类型定义中指定任何字节顺序转换(即您指定数据应该以本机float / double / integer格式编写),您应该能够实现“二进制兼容性”它

为了解决我的问题,我使用文件规范http://www.hdfgroup.org/HDF5/doc/H5.format.html

编写了一个HDF5文件解析器

使用相当简单的解析器,您应该能够识别任何数据集的偏移量(和大小)。在那一点上简单地说fseek和fread(在C中,也就是说,你可以在C ++中采用更高级别的方法)。

如果你的数据集是分块的,那么遍历用于组织块的b树就需要更多的解析。

您应该注意的唯一其他问题是处理任何(或消除)任何系统相关的结构填充。

答案 2 :(得分:0)

HDF5为您提供结构的二进制兼容性。你只需告诉它你的结构包含什么(dtype),并且你在保存/读取记录数组时没有问题 - 这是因为类型系统在numpy和HDF5之间基本上是1:1。如果您使用H5py,我有信心说IO应该足够快,只要您使用所有本机类型和大批量读/写 - 整个数据集都是允许的。在那之后它取决于分块和什么过滤器(例如shuffle,压缩) - 它也值得注意,有时那些可以通过大大减小文件大小来加速,所以总是看基准。请注意,类型和过滤器选项在最后创建HDF5文档。

如果您自己尝试解析HDF5,那么您做错了。如果您在C ++ / C中工作,请使用C ++和C apis。有一些所谓的"复合类型"在HDF5小组网站上。