TLDR
Sử dụng Python để quản lý / sửa đổi đầu vào của bạn và san lấp đầu ra của bạn và sử dụng HDF5 để sắp xếp / lưu trữ dữ liệu của bạn. Đầu tiên có vẻ phức tạp, nó vẫn đơn giản hơn SQL-mọi thứ.
Câu trả lời dài hơn + Ví dụ
cá nhân tôi sử dụng kết hợp tập lệnh Python và định dạng tệp HDF5 để xử lý các loại tình huống này. Tập lệnh Python có thể xử lý các thay thế văn bản cần thiết để thay đổi các tệp runfiles của bạn (và có thể kiểm tra các lần chạy trùng lặp) và với một số tập lệnh khác, bạn có thể lấy dữ liệu đầu ra từ chương trình của mình và đưa nó vào tệp HDF5.
Dễ dàng nhất khi nghĩ về HDF5 giống hoặc ít hơn chính xác như một hệ thống tệp thông thường (nghĩa là tập hợp các thư mục và thư mục con trên máy tính của bạn), nhưng dễ dàng chia tỷ lệ thành các tập dữ liệu lớn. Mỗi thư mục / thư mục con có thể được gắn thẻ bằng siêu dữ liệu (trong trường hợp của bạn chỉ là các tham số mà bạn đang thay đổi hoặc toàn bộ bộ tham số). Khi đến lúc phân tích dữ liệu của bạn, bạn có thể tìm kiếm thông qua dữ liệu đó dựa trên siêu dữ liệu.
Đây là một ví dụ ngắn về cách thức hoạt động của nó dựa trên một số dữ liệu mô phỏng của tôi (đã ở định dạng HDF5) trông như thế này:
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
là tệp HDF5 và mỗi Runxx là thư mục con chứa dữ liệu đầu ra từ một mô phỏng nhất định và được gắn thẻ với siêu dữ liệu liên quan. Một tập lệnh python tìm kiếm trong các lần chạy và trả về một danh sách những tập lệnh có siêu dữ liệu mong muốn sẽ trông như thế này:
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
Vì vậy, nếu tôi ở một dòng lệnh trong một thư mục chứa mydata.hdf5
tôi có thể chạy đoạn script trên như vậy:
python myscript.py mydata.hdf5 maxSteps 1e7 size 13
mà sẽ cho kịch bản tìm bất kỳ lần chạy nào với siêu dữ liệu khớp một phần hoặc toàn bộ {'maxSteps':'1e7', 'size':'13'}
. Tập lệnh sau đó có thể thao tác dữ liệu đó theo cách bạn thích (trong phần "làm gì đó ở đây") và sau đó nó sẽ in một danh sách trông giống như thế này:
["Run01", "Run03"]
Mặc dù vậy, một lưu ý là HDF5 sẽ chỉ hiển thị ánh xạ hoàn toàn tự nhiên cho dữ liệu của bạn nếu có thể biểu thị dữ liệu của bạn dưới dạng một tập hợp các mảng n chiều. Điều khá phổ biến là đầu ra của các mô phỏng nằm trong một loại mảng nào đó, vì vậy điều này có lẽ sẽ không thành vấn đề.
Điểm khởi đầu tốt
Python: http://www.openbookproject.net/thinkcs/python/english2e/
HDF5: http://www.h5py.org/docs/