TLDR
Используйте Python для управления / изменения вашего ввода и объединения вашего вывода, а также HDF5 для организации / хранения ваших данных. Как бы сложно это ни казалось на первый взгляд, все равно он будет проще, чем SQL.
Более длинный ответ + Пример
Я лично использую сочетание сценариев Python и формата файла HDF5 для решения подобных ситуаций. Сценарии Python могут обрабатывать текстовые замены, необходимые для изменения ваших исполняемых файлов (и могут проверять наличие дублирующих прогонов), и с помощью еще нескольких сценариев вы можете взять выходные данные из вашей программы и поместить их в файл HDF5.
Про HDF5 проще всего думать, что он более или менее точно похож на обычную файловую систему (т.е. набор каталогов и подкаталогов на вашем компьютере), но которая легко масштабируется для больших наборов данных. Каждый каталог / подкаталог может быть помечен метаданными (в вашем случае это либо просто параметры, которые вы изменяете, либо весь набор параметров). Когда приходит время анализировать ваши данные, вы можете искать их по метаданным.
Вот краткий пример того, как это будет работать, основываясь на некоторых моих данных моделирования (уже в формате HDF5), которые выглядят так:
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
является файлом HDF5, и каждый из Runxx является подкаталогом, который содержит выходные данные из данного моделирования и который помечен соответствующими метаданными. Сценарий Python, который просматривает прогоны и возвращает список тех, у кого есть нужные метаданные, будет выглядеть так:
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
Так что, если бы я находился в командной строке в каталоге, содержащем, mydata.hdf5
я мог бы запустить приведенный выше скрипт следующим образом:
python myscript.py mydata.hdf5 maxSteps 1e7 size 13
что скажет сценарию найти любые прогоны с частично или полностью совпадающими метаданными {'maxSteps':'1e7', 'size':'13'}
. Затем скрипт может манипулировать этими данными так, как вам нравится (в разделе «сделать что-то здесь»), и затем вывести список, который будет выглядеть примерно так:
["Run01", "Run03"]
Однако следует отметить, что HDF5 представит полностью естественное отображение для ваших данных, только если возможно представить ваши данные в виде набора n-мерных массивов. Обычно результаты моделирования находятся в каком-то массиве, так что это, вероятно, не будет проблемой.
Хорошие отправные точки
Python: http://www.openbookproject.net/thinkcs/python/english2e/
HDF5: http://www.h5py.org/docs/