TLDR
使用 Python 管理/修改您的输入和珊瑚您的输出,并使用 HDF5 来组织/存储您的数据。尽管起初看起来很复杂,但它仍然比 SQL-anything 更简单。
更长的答案 + 示例
我个人使用 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"]
不过需要注意的是,只有当可以将您的数据表示为一组 n 维数组时,HDF5 才会为您的数据呈现完全自然的映射。模拟的输出在某种数组中是很常见的,所以这可能不是问题。
良好的起点
Python:http
://www.openbookproject.net/thinkcs/python/english2e/
HDF5:http ://www.h5py.org/docs/