Python 与 SQLite(sqlite3,atpy)和 HDF5(h5py,pyTables)的接口似乎有很多选择——我想知道是否有人有将这些与 numpy 数组或数据表(结构化/记录数组)一起使用的经验,以及其中最无缝地与每种数据格式(SQLite 和 HDF5)的“科学”模块(numpy、scipy)集成。
1 回答
其中大部分取决于您的用例。
与传统的关系数据库相比,我在处理各种基于 HDF5 的方法方面有更多的经验,所以我不能对 Python 的 SQLite 库发表太多评论......
至少就h5py
vs而言pyTables
,它们都通过 numpy 数组提供了非常无缝的访问,但它们面向非常不同的用例。
如果您有想要快速访问任意基于索引的切片的 n 维数据,那么使用起来要简单得多h5py
。如果您有更像表格的数据,并且想要查询它,那么这pyTables
是一个更好的选择。
h5py
与pyTables
. 如果您要定期从另一种语言访问您的 HDF 文件(pyTables
添加一些额外的元数据),这是一件非常好的事情。 h5py
可以做很多事情,但是对于某些用例(例如做什么pyTables
),您将需要花费更多时间进行调整。
pyTables
有一些非常好的功能。但是,如果您的数据看起来不像表格,那么它可能不是最佳选择。
举一个更具体的例子,我经常处理相当大的(数十 GB)3 维和 4 维数据数组。它们是浮点数、整数、uint8s 等的同质数组。我通常想访问整个数据集的一小部分。 h5py
使这变得非常简单,并且在自动猜测合理的块大小方面做得相当好。从磁盘抓取任意块或切片比简单的内存映射文件快得多。(强调任意......显然,如果你想抓取整个“X”切片,那么 C 排序的内存映射数组是不可能被击败的,因为“X”切片中的所有数据在磁盘上都是相邻的。)
作为一个反例,我的妻子从各种传感器收集数据,这些传感器在几年内以分钟到秒的间隔进行采样。她需要对她的数据存储和运行任意查询(以及相对简单的计算)。 pyTables
使这个用例变得非常简单和快速,并且与传统的关系数据库相比仍然具有一些优势。(特别是在磁盘使用率和可以将大量(基于索引)数据块读入内存的速度方面)