TLDR
Verwenden Sie Python, um Ihre Eingabe zu verwalten / zu ändern und Ihre Ausgabe zu korrigieren , und verwenden Sie HDF5, um Ihre Daten zu organisieren / zu speichern. So komplex es auf den ersten Blick erscheinen mag, es wird immer noch einfacher sein als SQL - alles.
Längere Antwort + Beispiel
Ich persönlich verwende eine Kombination aus Python-Skripten und dem HDF5-Dateiformat, um mit solchen Situationen umzugehen. Python-Skripte können die Textersetzungen verarbeiten, die zum Ändern Ihrer Runfiles erforderlich sind (und nach doppelten Läufen suchen). Mit einigen weiteren Skripten können Sie die Ausgabedaten aus Ihrem Programm in eine HDF5-Datei einfügen.
Es ist am einfachsten, sich HDF5 als mehr oder weniger genau wie ein normales Dateisystem vorzustellen (dh als eine Reihe von Verzeichnissen und Unterverzeichnissen auf Ihrem Computer), das sich jedoch leicht auf große Datenmengen skalieren lässt. Jedes Verzeichnis / Unterverzeichnis kann mit Metadaten versehen werden (in Ihrem Fall entweder nur die Parameter, die Sie variieren, oder der gesamte Parametersatz). Wenn es Zeit ist, Ihre Daten zu analysieren, können Sie sie anhand der Metadaten durchsuchen.
Hier ist ein kurzes Beispiel, wie dies basierend auf einigen meiner Simulationsdaten (bereits im HDF5-Format) funktionieren würde, die so aussehen:
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
ist die HDF5-Datei, und Runxx ist jeweils ein Unterverzeichnis, das die Ausgabedaten einer bestimmten Simulation enthält und mit den zugehörigen Metadaten versehen ist. Ein Python-Skript, das die Läufe durchsucht und eine Liste derjenigen mit den gewünschten Metadaten zurückgibt, sieht folgendermaßen aus:
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
Wenn ich mich also an einer Befehlszeile in einem Verzeichnis befände, mydata.hdf5
das Folgendes enthält, könnte ich das obige Skript folgendermaßen ausführen:
python myscript.py mydata.hdf5 maxSteps 1e7 size 13
Dies würde das Skript anweisen, alle Läufe mit Metadaten zu finden, die teilweise oder vollständig übereinstimmen {'maxSteps':'1e7', 'size':'13'}
. Das Skript könnte diese Daten dann nach Belieben bearbeiten (im Abschnitt "Hier etwas tun") und dann eine Liste drucken, die ungefähr so aussieht:
["Run01", "Run03"]
Ein Hinweis ist jedoch, dass HDF5 nur dann eine völlig natürliche Zuordnung für Ihre Daten bietet, wenn es möglich ist, Ihre Daten als Satz von n-dimensionalen Arrays darzustellen. Es ist ziemlich üblich, dass die Ausgabe von Simulationen in einer Art Array erfolgt, daher ist dies wahrscheinlich kein Problem.
Gute Ausgangspunkte
Python: http://www.openbookproject.net/thinkcs/python/english2e/
HDF5: http://www.h5py.org/docs/