¿Debo usar una base de datos para manejar grandes cantidades de resultados?

8

Antecedentes:

Actualmente estoy ejecutando una gran cantidad de experimentos de variación de parámetros. Se están ejecutando en Python 2.6+, usando numpy. Estos experimentos demorarán aproximadamente 2 semanas en ejecutarse.

Aproximadamente estoy variando 3 parámetros (variables independientes) en un rango de valores. Estoy arreglando 6 variables independientes adicionales (por ahora) estoy informando sobre 4 variables dependientes.

Uno de los parámetros que estoy variando se está distribuyendo en varios procesos (y computadoras). Para cada uno de estos parámetros, genero csvarchivos separados con cada fila que contiene los valores de todas las variables (incluidas las independientes, fijas y dependientes). En toda la variación, se espera generar alrededor de 80,000 filas de datos.

La mayoría de las veces solo miro el valor de una de las variables dependientes, sin embargo, mantengo a los demás cerca, ya que pueden explicar lo que sucede cuando sucede algo inesperado.

En una versión anterior de este experimento, que variaba a través de solo 2 parámetros (cada uno aunque solo 2 valores) estaba copiando pegando este csvarchivo en un programa de hoja de cálculo y haciendo un montón de pegado de copias para hacer una tabla de solo la variable dependiente en la que estaba interesado Haciendo algunas cosas incómodas en MS-Excel para permitirme ordenar por fórmulas. Esto fue lo suficientemente doloroso para los 6 conjuntos de resultados de experimentos que tuve. Para cuando termine esta ejecución, tendré 2 órdenes de magnitud más resultados.

Pregunta:

Estaba pensando que una vez hecho esto, podría volcar todos los resultados de los csvarchivos en una base de datos, y consultar las partes que son interesantes. Luego tome esos resultados y póngalos en una hoja de cálculo para su análisis. Hacer gráficos, encontrar puntajes en relación con los resultados del control, etc.

¿Estoy pensando en la línea correcta? (¿Es esto lo que hace la gente?)

Mi base de datos está bastante oxidada en estos días, incluso cuando estaba bien, estaba usando MS-Access. Tenía la intención de usar MS-Access para esto también.

Lyndon White
fuente

Respuestas:

8

Sugeriría que una base de datos completa puede ser excesiva para sus propósitos, aunque ciertamente funcionaría. Incluso filas no deben tener más de alrededor de 25 mb de datos.5 5105 5

Recomiendo encarecidamente hacer el análisis / trazado / etc con la misma herramienta que utilizará para consultar sus datos. Según mi experiencia, cuando cambiar lo que analizar solo requiere cambiar 1 línea de código y esperar 2 segundos, es mucho más fácil sacar el máximo provecho de sus datos. El pegado de copias también es ALTAMENTE propenso a errores. He visto a varias personas en el punto de desesperación porque sus datos no tenían sentido, solo para darse cuenta de que cometieron un error al copiar datos en su hoja de Excel.

Si está familiarizado con Python, sugeriría usar pandas o (si tiene más datos de los que puede guardar en la memoria) pytables , que le brindarán todas las ventajas de una base de datos (incluida la velocidad). Pandas tiene muchas funciones de utilidad para trazar y analizar datos, y también tendría la pila científica completa de Python. Eche un vistazo a este cuaderno de ipython para ver un ejemplo del uso de pandas.

Creo que existen herramientas similares para R, así como software comercial como Matlab o Stata.

HDF5 es una buena forma genérica de almacenar los datos inicialmente, y tiene un buen soporte de biblioteca en muchos idiomas.

LKlevin
fuente
Necesito analizar y generar mis datos por separado. La generación de mis datos demorará como 2 semanas. ¿Esto cambia algo en tu respuesta?
Lyndon White
Lo siento, no estaba claro. Quiero decir que la herramienta que utiliza para consultar sus datos debe ser la misma que realiza su análisis y sus trazados. Es una gran ventaja poder rehacer todo simplemente ejecutando 1 script. Almacenaría los datos en hdf5, pero si prefiere una base de datos SQLite (como sugirió Geoff) también podría leer eso con SQLAlchemy en python.
LKlevin
Ah cierto eso tiene más sentido. Y también está abogando por un análisis programático y repetible
Lyndon White
¡Si! Respondiendo a la pregunta "¿cómo hice exactamente el análisis de los datos en este gráfico?" es mucho más fácil cuando solo puedes mirar el script haciendo todo.
LKlevin
Ahora que comencé el análisis con Pandas, siento que puedo aceptar esta respuesta.
Lyndon White
5

Recomiendo usar una herramienta como Sumatra para esto. Solía ​​tener un enfoque "peatonal" similar al suyo para realizar un seguimiento de muchas ejecuciones de simulación con parámetros variables, pero al final se convierte en un gran desastre porque es casi imposible diseñar un enfoque ad-hoc correctamente por adelantado y para anticipe todos los casos de uso y extensiones necesarios (por ejemplo, qué sucede si necesita introducir un parámetro adicional).

Sumatra realiza un seguimiento de todas sus ejecuciones de simulación y las almacena en una base de datos que luego se puede consultar (utilizando su API de Python) para filtrar y analizar los registros que le interesan. Es muy flexible y no le impone un flujo de trabajo, lo cual encuentro una gran ventaja. Además, viene con una interfaz web que le permite navegar rápidamente por los resultados (o inspeccionar / descargar archivos generados), lo cual es tremendamente útil. La base de datos predeterminada usa SQLite y me imagino que se vuelve un poco lenta si la usa para almacenar más de 80,000 resultados de simulación. Hay un backend PostgreSQL pero nunca lo he usado, así que no puedo garantizar su rendimiento.

Debo decir que todavía está en sus primeras etapas de desarrollo y faltan algunas cosas, pero lo he usado para casi todas mis simulaciones en el último año y me ha salvado el día tantas veces que no podía imaginar Lo que haría sin él. Personalmente, nunca lo usé para cálculos en diferentes computadoras (o en un clúster), pero creo que es compatible con este tipo de flujo de trabajo. Pregunte en la lista de correo si no está seguro o no puede encontrar exactamente lo que necesita, es una comunidad pequeña pero muy amigable y servicial.

Dame un grito si esto es algo en lo que estás interesado y estoy feliz de compartir mi flujo de trabajo y código repetitivo para que te pongas en marcha (o solo por inspiración).

Para el análisis de datos real, estoy de acuerdo con LKlevin en que los pandas y el portátil IPython son herramientas extremadamente útiles para conocer (Sumatra le permite importar los registros a los pandas, aunque esto es un poco por el momento, pero estoy seguro de que lo hará pronto se mejorará). También podría imaginar que guardar datos / resultados de simulación en formato HDF5 podría ser útil, en cuyo caso pytables es una buena herramienta en la caja de herramientas. (Parece recordar que el soporte para HDF5 está planeado en Sumatra, pero no puedo encontrar la información en este momento y no estoy seguro de que esto esté implementado todavía).

Por último, estoy seguro de que hay otras herramientas que ayudan con este tipo de tareas (consulte la "lista breve" en esta diapositiva de presentación ). Pero personalmente no he probado ninguno de esos porque estoy muy contento con la funcionalidad y flexibilidad que ofrece Sumatra.

cilix
fuente
1

Sí, puede volcar todos los resultados en una base de datos, y sí, algunas personas eligen usar bases de datos. Todavía no he tenido que lidiar con situaciones usando bases de datos, pero he enseñado en talleres donde otros instructores enseñan sobre el uso de bases de datos para recopilar datos. Para las bases de datos que no son masivas, por lo que entiendo, la tecnología subyacente no importa mucho. Mi co-instructor usó SQLite3. Es fácil de instalar en Linux, viene estándar en OS X y creo que está disponible para Windows.

Es posible acceder a bases de datos SQLite a través de un terminal en OS X y Linux; No estoy seguro de cómo se hace en Windows. También es posible aprovechar los paquetes de Python para leer y escribir en su base de datos mediante programación, por ejemplo, utilizando el paquete sqlite3 en la biblioteca estándar de Python.

Si sus conjuntos de datos se vuelven realmente grandes, otras implementaciones de bases de datos son mejores, y en ese punto, probablemente desee consultar a un especialista en bases de datos.

Geoff Oxberry
fuente
1

Si todos sus datos se ajustan cómodamente en la memoria (digamos, por debajo de 1 GB, por lo que tiene margen para el análisis), un DB es excesivo. Puede leer todo el archivo en la memoria y seleccionar las piezas que desee. Por otro lado, cuando sus datos comienzan a crecer (o podrían crecer demasiado), un DB puede ofrecerle consultas rápidas y fáciles ( "deme todas las velocidades para las cuales la energía era exactamente 2 y la temperatura mayor que 27") )

Otro tema es la generación de datos. Como sus datos tardan dos semanas, supongo que los está generando en un clúster informático en paralelo. La configuración de una base de datos para la escritura paralela es compleja y puede ralentizar el proceso, ya que los datos se transfieren y los bloqueos están en su lugar. Como solo necesita escribir cosas una vez, puede hacer que cada proceso genere su propio archivo de texto temporal, escriba los resultados allí y haga que un proceso central lea cada uno de estos y lo descargue en una base de datos maestra. Para el caso más simple, este script puede ser simple caty guardar el resultado como texto sin formato.

Ahora, supongamos que desea usar una base de datos. Si su caso de uso es algo un poco más avanzado que un archivo de texto (lo que haría si hubiera cargado un CSV con Numpy), recomiendo HDF5 a través de PyTables. Es rápido, fácil de configurar, compatible con Numpy y con un montón de funciones avanzadas si desea ajustar las cosas. También admite compresión, consulta y almacenamiento de matrices. También es fácil de instalar en Linux, Windows y Mac. El diseño de datos HDF5 no es más que tablas, como una hoja de cálculo. El .h5archivo resultante puede leerse desde muchos lenguajes de computadora si tienen instalada la biblioteca adecuada.

Por otro lado tienes SQL. Tiene uno en stdlib de Python, por lo que ya lo tendría instalado, pero no es muy adecuado para el trabajo numérico (por ejemplo, no puede guardar y recuperar matrices de Numpy tan fácilmente). Esta es la mejor opción si necesita que terceros interactúen desde otros idiomas, ya que es muy conocido y hay envoltorios para casi cualquier idioma, muchos de ellos vienen por defecto.

Davidmh
fuente