2010-11-09 111 views
2

当我使用NumPy时,我以原生格式* .npy存储它的数据。它的速度非常快,给了我一些好处,像这样的HDF5:存储NumPy数据

  • 我能读* .npy从C代码为 简单的二进制数据(我的意思是* .npy是 二进制兼容与C结构)

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

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

UPD:

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

+0

你是说你已经在C++中使用代码来读取hdf5文件,并且你发现它比从.npy文件读取要慢得多?另外,我确信matlab可以读取原始的二进制文件,所以如果这是你使用hdf5的唯一原因,也许你应该仔细阅读将.npy文件读入matlab。 – DaveP 2010-11-09 22:23:54

+0

不,我正在读取C++中的* .npy作为二进制数据,并且想用hdf5来完成这个技巧。从MATLAB读* .npy看起来很成问题 – 2010-11-10 08:16:02

+0

默认情况下,HDF5没有压缩。 – Yossarian 2013-05-15 12:58:20

回答

1

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

如果你在文件创建的“控制”(并且写入数据 - 即使你使用API​​),你应该能够在很大程度上完全规避HDF5库。

如果输出数据集没有分块,它们将被连续写入。只要你没有在数据类型定义中指定任何字节顺序转换(即你指定的数据应该用本地浮点/双精度/整数格式编写),你应该能够达到“二进制兼容”它。

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

有了一个相当简单的解析器HDF5文件分析器,你应该能够识别偏移(和大小)的任何数据集。在这一点上,只需fseek和fread(在C中,也就是说,可以在C++中采用更高级别的方法)。

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

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

+0

填充不会是一个问题,我会解决它。感谢您的回复 – 2010-11-10 08:25:07

+0

你介意吗?分享你的分析器? – 2012-03-18 16:14:35

+0

没有人需要像这样访问数据。如果您坚持使用HDF5的性能原则,那么这太冒险了,如果不是真的要提高速度。不仅如此,但如果有人不使用本地类型或在数据集中有更多的填充/变量呢?谁知道客户端平台会吐出什么。这是脆弱和危险的建议,这为HDF5制造的原因打了很大的一部分。 – 2015-05-03 01:59:16

9

从C中读取hdf5文件的正确方法是使用hdf5 API - 请参阅tutorial。原则上,可以像使用.npy文件一样直接从hdf5文件读取原始数据,前提是您尚未在hdf5文件中使用高级存储选项(如压缩)。然而,这基本上违背了使用hdf5格式的整个观点,我不能想到这样做的好处,而不是使用合适的hdf5 API。还要注意,API有一个simplified high level version这应该使从C读取相对无痛。

+0

看到我的更新,我添加了一些细节。你可以写更多关于直接从hdf5中读取原始数据(以及如何关闭hdf5中的压缩和其他存储选项) – 2010-11-09 13:58:59

0

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

如果你想自己解析HDF5,那么你做错了。如果您使用C++/C,请使用C++和C apis。在HDF5网站上有一些所谓的“复合类型”的例子。