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/