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 csv
archivos 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 csv
archivo 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 csv
archivos 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.
fuente
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.
fuente
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.
fuente
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
cat
y 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
.h5
archivo 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.
fuente