Python 以SQLite和HDF5格式从导出/导入到numpy、scipy
Python与SQLite(sqlite3,atpy)和HDF5(h5py,pyTables)的接口似乎有很多选择——我想知道是否有人有过将它们与numpy数组或数据表(结构化/记录数组)一起使用的经验,以及对于每种数据格式,哪种最能与“科学”模块(numpy,scipy)无缝集成(SQLite和HDF5)。大部分取决于您的用例 和传统的关系数据库相比,我在处理各种基于HDF5的方法方面有更多的经验,所以我不能对python的SQLite库做太多评论 至少就Python 以SQLite和HDF5格式从导出/导入到numpy、scipy,python,sqlite,numpy,scipy,hdf5,Python,Sqlite,Numpy,Scipy,Hdf5,Python与SQLite(sqlite3,atpy)和HDF5(h5py,pyTables)的接口似乎有很多选择——我想知道是否有人有过将它们与numpy数组或数据表(结构化/记录数组)一起使用的经验,以及对于每种数据格式,哪种最能与“科学”模块(numpy,scipy)无缝集成(SQLite和HDF5)。大部分取决于您的用例 和传统的关系数据库相比,我在处理各种基于HDF5的方法方面有更多的经验,所以我不能对python的SQLite库做太多评论 至少就h5py与pyTables而言,它们都
h5py
与pyTables
而言,它们都通过numpy阵列提供非常无缝的访问,但它们面向非常不同的用例
如果您有n维数据,希望快速访问任意基于索引的数据片,那么使用h5py
就简单得多。如果您有更像表的数据,并且希望查询它,那么pyTables
是一个更好的选择
与pyTables
相比,h5py
是HDF5库的一个相对“普通”的包装。如果您要定期从另一种语言访问HDF文件(pyTables
添加了一些额外的元数据),h5py
可以做很多事情,但对于某些用例来说,这是一件非常好的事情(例如,pyTables
所做的)您将需要花费更多的时间来调整内容
pyTables
有一些非常好的功能。但是,如果您的数据看起来不太像一个表,那么它可能不是最好的选择
举一个更具体的例子,我经常使用相当大的容量(几十GB)3维和4维数据数组。它们是浮点、int、uint8s等的同质数组。我通常希望访问整个数据集的一小部分。h5py
使这非常简单,并且在自动猜测合理的数据块大小方面做得相当好。从磁盘获取任意数据块或数据片要比从磁盘获取任意数据块或数据片快得多简单的memmapped文件(强调任意性……显然,如果您想要获取整个“X”片,那么C顺序的memmapped数组是不可能的,因为“X”片中的所有数据在磁盘上都是相邻的。)
作为一个反例,我妻子从一系列传感器收集数据,这些传感器在几年内每隔几分钟采样一次。她需要存储和运行任意查询(以及相对简单的计算)在她的数据上。
pyTables
使得这个用例非常简单和快速,并且与传统的关系数据库相比仍然具有一些优势(特别是在磁盘使用率和将大量(基于索引的)数据块读入内存的速度方面)你是在问关于将numpy数据保存到SQLite表中的问题吗?谢谢——这正是我在对比h5py
和pyTables
中寻找的信息。但是,这不一定是numpy所需要的,而是numpy数组中的实际数据所需要的。我将SQLite
部分作为一个例子发布另一个问题。@JoeKington:旁注:我不确定“C-ordered memmapped array无法击败”:使用memcpy()复制数据可能比传输压缩数据并在到达处理器时解压要慢()。净效果是处理压缩的数组数据可能比处理未压缩的数组数据更快。