TLDR
Use Python para administrar / modificar su entrada y coral su salida, y use HDF5 para organizar / almacenar sus datos. Por complejo que parezca al principio, aún será más simple que SQL-cualquier cosa.
Respuesta más larga + Ejemplo
Yo personalmente uso una combinación de secuencias de comandos Python y el formato de archivo HDF5 para tratar este tipo de situaciones. La secuencia de comandos de Python puede manejar las sustituciones de texto necesarias para alterar sus archivos de ejecución (y puede verificar si hay ejecuciones duplicadas), y con algunas secuencias de comandos más puede tomar los datos de salida de su programa y ponerlos en un archivo HDF5.
Es más fácil pensar que HDF5 es más o menos exactamente como un sistema de archivos normal (es decir, el conjunto de directorios y subdirectorios en su computadora), pero que se adapta fácilmente a grandes conjuntos de datos. Cada directorio / subdirectorio se puede etiquetar con metadatos (en su caso, ya sea solo los parámetros que está variando o el conjunto completo de parámetros). Cuando llegue el momento de analizar sus datos, puede buscarlos en función de los metadatos.
Aquí hay un breve ejemplo de cómo funcionaría esto basado en algunos de mis datos de simulación (ya en formato HDF5) que se ve así:
mydata.hdf5
|___Run01(metadata: {size:13, maxSteps:1e7, maxTime:inf})
|___Run02(metadata: {size:10, maxSteps:1e6, maxTime:inf})
|___Run03(metadata: {size:13, maxSteps:1e7, maxTime:inf})
|___Run04(metadata: {size:9, maxSteps:1e7, maxTime:inf})
mydata.hdf5
es el archivo HDF5, y cada uno de Runxx es un subdirectorio que contiene los datos de salida de una simulación dada, y que está etiquetado con los metadatos asociados. Un script de Python que busca en las ejecuciones y devuelve una lista de aquellos con los metadatos deseados se vería así:
import sys
import h5py #the python module that interfaces with HDF5
def GetRuns(hdfRoot, attributeValuePairs):
return [subdir for subdir in hdfRoot.values() if not(attributeValuePairs.viewitems() - dict(subdir.attrs).viewitems())]
if __name__=="__main__":
attributeValuePairs = dict(zip(sys.argv[2::2], sys.argv[3::2]))
with h5py.File(sys.argv[1]) as hdfRoot:
runs = GetRuns(hdfRoot, attributeValuePairs)
#do something here with runs...
print runs
Entonces, si estaba en una línea de comando en un directorio que contiene mydata.hdf5
, podría ejecutar el script anterior de la siguiente manera:
python myscript.py mydata.hdf5 maxSteps 1e7 size 13
lo que le indicaría al script que encuentre cualquier ejecución con metadatos que coincidan parcial o totalmente {'maxSteps':'1e7', 'size':'13'}
. El script podría manipular esos datos como quisiera (en la sección "hacer algo aquí"), y luego imprimiría una lista que se vería así:
["Run01", "Run03"]
Sin embargo, una nota es que HDF5 presentará una asignación totalmente natural para sus datos solo si es posible representar sus datos como un conjunto de matrices n-dimensionales. Es bastante común que la salida de las simulaciones esté en algún tipo de matriz, por lo que probablemente esto no sea un problema.
Buenos puntos de partida
Python: http://www.openbookproject.net/thinkcs/python/english2e/
HDF5: http://www.h5py.org/docs/