TLDR
Usa Python per gestire / modificare i tuoi input e corri i tuoi output, e usa HDF5 per organizzare / archiviare i tuoi dati. Per quanto complesso possa sembrare all'inizio, sarà ancora più semplice di SQL-niente.
Risposta più lunga + Esempio
Uso personalmente una combinazione di script Python e il formato di file HDF5 per gestire questo tipo di situazioni. Gli script Python sono in grado di gestire le sostituzioni di testo necessarie per alterare i tuoi file di esecuzione (e possono verificare la presenza di esecuzioni duplicate), e con alcuni altri script puoi prendere i dati di output dal tuo programma e metterli in un file HDF5.
È più facile pensare a HDF5 come più o meno esattamente come un normale file system (cioè l'insieme di directory e sottodirectory sul tuo computer), ma che si ridimensiona facilmente a grandi set di dati. Ogni directory / sottodirectory può essere taggata con metadati (nel tuo caso o solo i parametri che stai variando o l'intero set di parametri). Quando arriva il momento di analizzare i tuoi dati, puoi cercarli in base ai metadati.
Ecco un breve esempio di come funzionerebbe sulla base di alcuni dei miei dati di simulazione (già in formato HDF5) che assomiglia a questo:
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
è il file HDF5 e ciascuno di Runxx è una sottodirectory che contiene i dati di output di una determinata simulazione e che è taggato con i metadati associati. Uno script Python che cerca tra le esecuzioni e restituisce un elenco di quelli con i metadati desiderati sarebbe simile al seguente:
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
Quindi, se fossi su una riga di comando in una directory contenente, mydata.hdf5
potrei eseguire lo script sopra in questo modo:
python myscript.py mydata.hdf5 maxSteps 1e7 size 13
che direbbe allo script di trovare eventuali esecuzioni con metadati parzialmente o totalmente corrispondenti {'maxSteps':'1e7', 'size':'13'}
. Lo script potrebbe quindi manipolare quei dati come preferisci (nella sezione "fai qualcosa qui"), e quindi stamperebbe un elenco che assomiglierebbe a questo:
["Run01", "Run03"]
Una nota però è che HDF5 presenterà una mappatura totalmente naturale per i tuoi dati solo se è possibile rappresentare i tuoi dati come un insieme di matrici n-dimensionali. È abbastanza comune che l'output delle simulazioni si trovi in una sorta di array, quindi probabilmente questo non sarà un problema.
Buoni punti di partenza
Python: http://www.openbookproject.net/thinkcs/python/english2e/
HDF5: http://www.h5py.org/docs/