Exportando desde / importando a numpy, scipy en formatos SQLite y HDF5

Parece que hay muchas opciones para que Python se interconecte con SQLite (sqlite3, atpy) y HDF5 (h5py, pyTables). Me pregunto si alguien tiene experiencia en el uso de estos con arrays numpy o tablas de datos (arrays estructurados / de registros), y cuáles de estos se integran de manera más transparente con módulos “científicos” (numpy, scipy) para cada formato de datos (SQLite y HDF5).

La mayor parte depende de su caso de uso.

Tengo mucha más experiencia en el manejo de los diversos métodos basados ​​en HDF5 que en las bases de datos relacionales tradicionales, por lo que no puedo comentar demasiado sobre las bibliotecas SQLite para python …

Al menos en lo que se refiere a h5py vs pyTables , ambos ofrecen un acceso muy sencillo a través de matrices numpy, pero están orientados a casos de uso muy diferentes.

Si tiene datos nidimensionales de los que desea acceder rápidamente a un segmento arbitrario basado en índices , entonces es mucho más sencillo usar h5py . Si tiene datos más parecidos a una tabla y desea consultarlos, entonces pyTables es una opción mucho mejor.

h5py es una envoltura relativamente “vanilla” alrededor de las bibliotecas HDF5 en comparación con pyTables . Esto es algo muy bueno si va a acceder regularmente a su archivo HDF desde otro idioma ( pyTables agrega algunos metadatos adicionales). h5py puede hacer mucho , pero para algunos casos de uso (por ejemplo, lo que hace pyTables ), necesitará dedicar más tiempo a ajustar las cosas.

pyTables tiene algunas características realmente agradables. Sin embargo, si sus datos no se parecen mucho a una tabla, entonces probablemente no sea la mejor opción.

Para dar un ejemplo más concreto, trabajo mucho con conjuntos de datos de 3 y 4 dimensiones bastante grandes (decenas de GB). Son matrices homogéneas de flotadores, ints, uint8s, etc. Por lo general, quiero acceder a un pequeño subconjunto de todo el conjunto de datos. h5py hace muy simple, y hace un trabajo bastante bueno de auto-adivinar un tamaño razonable. Agarrar un fragmento o trozo arbitrario del disco es mucho, mucho más rápido que para un simple archivo memmapped. (Énfasis en arbitrario … Obviamente, si desea capturar una porción “X” completa, entonces es imposible superar una matriz memmapped ordenada por C, ya que todos los datos en una porción “X” están adyacentes en el disco.)

Como ejemplo de contador, mi esposa recostack datos de una amplia gama de sensores que muestrean a intervalos de minuto a segundo durante varios años. Necesita almacenar y ejecutar consultas arbitrarias (y cálculos relativamente simples) en sus datos. pyTables hace que este caso de uso sea muy fácil y rápido, y aún tiene algunas ventajas sobre las bases de datos relacionales tradicionales. (Especialmente en términos de uso del disco y velocidad a la que se puede leer en la memoria una gran parte de los datos (basados ​​en índices))