python mongodb orm scientific-computing hdf5

python - pymongo



Persistencia de datos de datos de simulación científica, Mongodb+HDF5? (2)

Estoy desarrollando un paquete de software de simulación Monte Carlo que involucra múltiples físicos y simuladores. Necesito hacer análisis en línea, rastrear la dependencia de datos derivados en datos brutos y realizar consultas como "darme las formas de onda para temperatura> 400 y posición cerca (x0, y0)". Entonces, el modelo de datos en memoria es bastante complicado.

La aplicación está escrita en Python, con cada resultado de simulación modelado como un objeto de Python. En cada hora produce ~ 100 resultados (objetos). La mayoría de los objetos tienen datos pesados ​​(varios MB de matriz numérica binaria), así como algunos datos de luz (temperatura, posición, etc.). La tasa de generación de datos totales es de varios GB por hora.

Necesito alguna solución de persistencia de datos y una API de consulta fácil de usar. Ya he decidido almacenar los datos pesados ​​(matriz numérica) en almacenamiento (s) HDF5. Estoy considerando usar MongoDB para la persistencia de objetos (solo datos ligeros) y para indexar los datos pesados ​​en HDF5. La persistencia de objetos con MongoDB es sencilla, y la interfaz de consulta parece lo suficientemente potente.

Conozco la opción sqlalchemy + sqlite. Sin embargo, la transmisión de datos pesados ​​a HDF5 no parece ser compatible de forma natural en SqlAlchemy, y un esquema fijo es engorroso.

Soy consciente de esta publicación ( Búsqueda de un conjunto de datos HDF5 ), pero la "tabla de índice" en sí misma necesita algunos índices en memoria para consultas rápidas.

Me pregunto si hay soluciones alternativas que debería mirar antes de saltar. ¿O hay algún problema que he pasado por alto en mi plan?

TIA.



Algunas cosas que debes saber sobre Mongo que podrían ser relevantes para la situación que describes y por qué podría ser una buena opción:

Necesito hacer análisis en línea, rastrear la dependencia de datos derivados en datos brutos y realizar consultas como "darme las formas de onda para temperatura> 400 y posición cerca (x0, y0)".

Mongo tiene un lenguaje de consulta flexible que hace que sea muy fácil hacer consultas como esta. Los índices geoespaciales (2D) también son compatibles. Además, si necesita realizar consultas sobre la posición y la temperatura con mucha frecuencia, puede crear un índice compuesto (temperatura, posición) y esto garantizará que la consulta siempre tenga un buen rendimiento.

La mayoría de los objetos tienen datos pesados ​​(varios MB de matriz numérica binaria), así como algunos datos de luz (temperatura, posición, etc.).

Cada documento en MongoDB puede almacenar hasta 16MB de datos, y también se admite un tipo de campo binario, por lo que sería relativamente sencillo insertar algunos megas de binario en un campo y recuperarlo consultando otros campos en los datos. Si espera necesitar más de 16 MB, también puede usar la API GridFS de mongodb, que le permite almacenar arbitrariamente grandes cantidades de datos binarios en el disco y recuperarlos rápidamente.

La tasa de generación de datos totales es de varios GB por hora.

Para un conjunto de datos grande y de rápido crecimiento como este, puede crear una configuración fragmentada que le permitirá agregar servidores para acomodar el tamaño sin importar cuán grande pueda ser.