与其他格式相比,HDF 有哪些优势?HDF 真正适合和有用的主要数据科学任务是什么?
与其他格式相比,HDF 有哪些优势?
也许解释这个问题的一个好方法是,与替代格式相比有什么优势?
我认为主要的替代方案是:数据库、文本文件或其他打包/二进制格式。
要考虑的数据库选项可能是列式存储或 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 与替代方案的经验,某个小的(远小于内存大小)数据集需要 2 秒才能读取为 HDF(其中大部分可能是 Pandas 的开销);从 JSON 读取约 1 分钟;和 1小时写入数据库。当然可以加快数据库写入速度,但最好有一个好的 DBA!这就是它开箱即用的方式。
一个好处是广泛的支持——C、Java、Perl、Python 和 R 都具有 HDF5 绑定。
另一个好处是速度。我从未见过它进行基准测试,但 HDF 应该比 SQL 数据库快。
我知道它与大量科学数据和时间序列数据一起使用时非常好 - 网络监控,使用跟踪等。
我不相信 HDF 文件有大小限制(尽管操作系统限制仍然适用。
要添加,请查看ASDF,尤其是他们的论文ASDF:天文学的新数据格式;ASDF 试图对 HDF5 进行改进,该论文描述了 HDF5 格式的一些缺点。
HDF5 专业人士
pandas
开箱即用支持- 因此,由
jupyter-notebook
开箱即用的支持 - 其他软件的良好支持
- 包括大量元数据
- 单个文件可以存储多个数据帧
- 每个数据框都包含大量元数据(我认为)
- 因此:
- 它非常适合理解数据,它是自我描述的
- 非常适合实验
HDF5 缺点
- 使用简单的工具:文件必须适合 RAM
- 更加小心:您访问的数据帧必须适合 RAM,并且
- 该文件必须在本地存储中
- 每个数据框都有一个模式,它是同质的
- 一些云系统不支持开箱即用 (👉 aws)
- 因此:
- 不适合大量数据
- 不适用于网络存储(例如 s3)
- 不适用于架构随时间变化的情况