从SQLite和HDF5格式导出/导入到numpy,scipy

hat*_*rix 12 python sqlite numpy hdf5 scipy

Python与SQLite(sqlite3,atpy)和HDF5(h5py,pyTables)的接口似乎有很多选择 - 我想知道是否有人有使用numpy数组或数据表(结构化/记录数组)的经验,以及其中最为无缝地与每种数据格式的"科学"模块(numpy,scipy)集成(SQLite和HDF5).

Joe*_*ton 23

大部分取决于您的使用案例.

与传统的关系数据库相比,我在处理各种基于HDF5的方法方面有很多经验,所以我不能过多评论SQLite库的python ...

至少就h5pyvs而言pyTables,它们都通过numpy阵列提供非常无缝的访问,但它们面向非常不同的用例.

如果您想要快速访问任意基于索引的切片的n维数据,那么使用起来要简单得多h5py.如果您的数据更像表格,并且您想查询它,那么这pyTables是一个更好的选择.

h5py与HDF5库相比,它是一个相对"香草"的包装器pyTables.如果您要定期从其他语言访问HDF文件(pyTables添加一些额外的元数据),这是一件非常好的事情. h5py可以做很多事情,但对于某些用例(例如,什么pyTables做),你需要花更多的时间来调整事情.

pyTables有一些非常好的功能.但是,如果您的数据看起来不像表,那么它可能不是最佳选择.

为了给出一个更具体的例子,我用相当大(数十GB)的3维和4维数据阵列工作了很多.它们是浮点数,整数,uint8等的同质数组.我通常想要访问整个数据集的一小部分. h5py这使得这非常简单,并且在自动猜测合理的块大小方面做得相当不错.从磁盘中抓取任意块或切片要比简单的memmapped文件快得多.(强调任意......显然,如果你想抓住一个完整的"X"切片,那么一个C排序的memmapped数组是不可能击败的,因为"X"切片中的所有数据都在磁盘上相邻.)

作为一个反例,我的妻子收集来自各种传感器的数据,这些传感器在几年到几秒的时间间隔内进行采样.她需要在她的数据上存储和运行任意查询(以及相对简单的计算). pyTables使这个用例非常容易和快速,并且仍然比传统的关系数据库有一些优势.(特别是在磁盘使用率和可以将大型(基于索引的)数据块读入内存的速度方面)

  • @JoeKington:旁注:我不确定"C-ordered memmapped array是不可能击败的":使用memcpy()复制数据可能比传输压缩数据并在到达处理器时对其进行解压缩要慢(http:/ /blosc.pytables.org/trac).实际效果是处理压缩阵列数据可能比处理未压缩阵列数据更快. (4认同)