从SQLite和HDF5格式导出/导入numpy和scipy
看起来在Python中,有很多选择可以用来和SQLite(比如sqlite3、atpy)以及HDF5(比如h5py、pyTables)进行交互。我想知道有没有人有经验把这些和numpy数组或者数据表(结构化/记录数组)一起使用,哪一种和“科学”模块(像numpy、scipy)结合得最顺畅,适用于每种数据格式(SQLite和HDF5)。
1 个回答
这主要取决于你的使用场景。
我在处理各种基于HDF5的方法方面经验丰富,相比之下对传统的关系数据库了解不多,所以对Python的SQLite库就不太能发表意见了……
就h5py
和pyTables
而言,它们都能通过numpy数组很方便地访问数据,但它们的使用场景却大相径庭。
如果你有n维数据,想快速访问某个特定的索引切片,那么使用h5py
会简单得多。如果你的数据更像是表格,并且你想对它进行查询,那么pyTables
就是更好的选择。
相较于pyTables
,h5py
是一个相对“基础”的HDF5库封装。如果你打算经常从其他语言访问你的HDF文件,这一点非常好(pyTables
会添加一些额外的元数据)。h5py
能做很多事情,但对于某些特定的使用场景(比如pyTables
的功能),你可能需要花更多时间去调整。
pyTables
有一些非常不错的功能。不过,如果你的数据看起来不太像表格,那么它可能不是最佳选择。
举个更具体的例子,我经常处理比较大的(几十GB)三维和四维数据数组。这些数组都是同质的,包含浮点数、整数、无符号8位整数等。我通常想访问整个数据集中的一个小子集。h5py
让这个过程非常简单,并且能够很好地自动猜测合适的块大小。从磁盘获取任意块或切片的速度比简单的内存映射文件快得多。(强调一下“任意”……显然,如果你想获取整个“X”切片,那么C顺序的内存映射数组是无与伦比的,因为“X”切片中的所有数据在磁盘上都是相邻的。)
作为一个反例,我妻子从各种传感器收集数据,这些传感器在几年的时间里以分钟到秒的间隔进行采样。她需要存储数据并对其进行任意查询(以及相对简单的计算)。pyTables
让这个使用场景变得非常简单和快速,并且在某些方面比传统的关系数据库还有优势。(特别是在磁盘使用和读取大块(基于索引)数据到内存的速度方面)