2011-10-25 14 views
11

Parece que hay muchas opciones para que Python interactúe con SQLite (sqlite3, atpy) y HDF5 (h5py, pyTables) - Me pregunto si alguien tiene experiencia en usar estos junto con matrices numpy o tablas de datos (matrices estructuradas/de registros), y cuál de ellas se integra perfectamente con módulos "científicos" (numpy, scipy) para cada formato de datos (SQLite y HDF5).exportando desde/importando a numpy, scipy en formatos SQLite y HDF5

+0

¿Está preguntando por guardar datos numpy en tablas SQLite? –

+0

Sí, parte de esto ... – hatmatrix

Respuesta

21

La mayor parte depende de su caso de uso.

que tienen mucha más experiencia en tratar con los diversos métodos basados ​​en HDF5 que bases de datos relacionales tradicionales, así que no puedo comentar demasiado en las bibliotecas de SQLite para pitón ...

Al menos en lo que 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 n-dimensionales que desea acceder rápidamente a una arbitraria basado en índices rebanada de, entonces es mucho más fácil de usar h5py. Si tiene datos más parecidos a una tabla y desea consultarlos, entonces pyTables es una opción mucho mejor.

h5py es un contenedor relativamente "vainilla" 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 un lote , pero para algunos casos de uso (por ejemplo, pyTables) necesitará pasar más tiempo ajustando las cosas.

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

Para dar un ejemplo más concreto, trabajo mucho con matrices de datos bastante grandes (decenas de GB) de 3 y 4 dimensiones. Son conjuntos homogéneos de flotantes, ints, uint8s, etc. Por lo general, quiero acceder a un pequeño subconjunto de todo el conjunto de datos. h5py hace esto muy muy simple, y hace un buen trabajo de adivinar automáticamente un tamaño de fragmento razonable. Tomar un trozo o porción arbitraria del disco es mucho, mucho más rápido que para un archivo memmapped simple. (Énfasis en arbitrario ... Obviamente, si desea tomar una porción "X" completa, entonces una matriz memmapped ordenada por C es imposible de superar, ya que todos los datos en una división "X" son adyacentes en el disco).

Como un ejemplo de contador, mi esposa recopila datos de una amplia gama de sensores que muestrean intervalos de minutos a segundos durante varios años. Ella 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. (Particularmente en términos de uso de disco y velocidad a la que se puede leer en la memoria un gran fragmento de datos (basado en índices)

+0

Gracias - este es exactamente el tipo de información que estaba buscando al contrastar 'h5py' y' pyTables' ... pero entonces no es necesariamente lo que va con NumPy, pero que va bien con los datos reales en la matriz NumPy. Voy a publicar la parte 'SQLite' como una pregunta separada. – hatmatrix

+4

@JoeKington: Nota al margen: no estoy seguro de que "la matriz memmapped ordenada por C sea imposible de superar": copiar datos con memcpy() puede ser más lento que transferir datos comprimidos y descomprimirlos cuando llega al procesador (http: //blosc.pytables.org/trac).El efecto neto es que procesar datos de matriz comprimida puede ser más rápido que procesar datos de matriz sin comprimir. – EOL

Cuestiones relacionadas