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