Answers:
解释这个问题的一个好方法也许是,与替代格式相比有哪些优势?
我认为主要的替代方法是:数据库,文本文件或其他打包/二进制格式。
要考虑的数据库选项可能是列式存储或NoSQL,或用于小型独立数据集SQLite。数据库的主要优点是能够处理比内存大得多的数据,具有随机访问或索引访问以及快速添加/追加/修改数据的能力。主要缺点是它比HDF慢得多,因为需要读取和处理整个数据集。另一个缺点是,除了像SQLite这样的嵌入式数据库外,数据库是一个系统(需要管理,设置,维护等),而不是简单的自包含数据存储。
文本文件格式选项为XML / JSON / CSV。它们是跨平台/语言/工具包,由于具有自我描述能力(或显而易见的:),因此是一种很好的存档格式。如果未压缩,它们将很大(10x-100x HDF),但是如果被压缩,它们将相当节省空间(压缩的XML与HDF大致相同)。这里的主要缺点还是速度:解析文本比HDF慢得多。
其他二进制格式(npy / npz numpy文件,blz blaze文件,协议缓冲区,Avro等)与HDF具有非常相似的属性,但它们的支持范围较广(可能仅限于一个平台:numpy),并且可能还有其他特定限制。它们通常不提供引人注目的优势。
HDF是数据库的很好的补充,如果要使用相同的数据不止一次,则运行查询以生成大致内存大小的数据集,然后将其缓存在HDF中可能是有意义的。如果您的数据集是固定的,并且通常作为一个整体进行处理,那么将其存储为适当大小的HDF文件的集合并不是一个坏选择。如果您的数据集经常更新,那么将其作为HDF文件定期进行存储可能仍会有所帮助。
总而言之,HDF是一种通常用于整体读取(或写入)数据的良好格式。由于广泛的支持和兼容性,它是许多应用程序的通用语言或通用/首选交换格式,具有良好的存档格式,并且速度非常快。
PS为了提供一些实际的背景,我最近将HDF与替代方案进行比较的经验是,某个小的(远小于内存大小的)数据集读为HDF花费了2秒的时间(其中大部分可能来自Pandas的开销);从JSON读取大约1分钟;和1个小时写入数据库。当然可以加快数据库写入速度,但是您最好拥有一个好的DBA!这就是开箱即用的方式。
要添加,请查看ASDF,尤其是他们的论文ASDF:天文学的新数据格式;ASDF尝试对HDF5进行改进,并且本文描述了HDF5格式的一些缺点。