simülasyonları yönetme önerisi?


9

Bu sorular compcci'de biraz konu dışı olabilir. gerekiyorsa lütfen nereye uyduğunu önerin.

Soru, tüm simülasyonların verimli bir şekilde nasıl yönetileceği ile ilgilidir.

diyelim ki bir simülasyon belirli bir önerilen değer aralığında tanımlanması gereken 2 parametreyi sabitlemeyi gerektirir.

İki parametrenin bir çiftinin ürettiği daha iyi bir sonuç bulmak için (örneğin simülasyon sonucunu deneysel verilerle karşılaştırarak), her parametre için üç değer tanımlayıp daha sonra 9 çalışma formüle ederek duyarlılık analizi yapılabilir.

önceden her çalışma için girdileri değiştirmek için sed kullanın ve bu çalışma girişlerini ve sonuçlarını depolayan klasörde değer ve parametre adını yazarak her bir çalışmayı etiketleyin. ancak parametre sayısı arttığında bunun çok verimsiz olduğunu gördüm (örn. çizim için komut dosyalarındaki klasörlerin adına erişin).

daha sonra basit numaraları klasör adı olarak kullanmaya ve diğer bazı elektronik tabloların ayrıntılarını depolamaya karar verdim. bu şekilde şimdiye kadar iyi ama zahmetli bir çalışma gerektirir. ayrıca koşuların büyümesi ile, birkaç gün önce yapılmış başka bir koşu yapmak gibi hata yapmak yaygınlaşır.

Bu koşuları yönetme konusunda iyi bir fikrin var mı? Monte Carlo analizi yapan biri için son derece önemli olacağını düşünüyorum.

Şimdiden teşekkürler!


2
Bu tür görevler için genellikle basit Python betikleri kullanırım. Verileri üretir, simülasyonları çalıştırır ve elde edilen çıktıları yönetir. Numpy / scipy / matplotlib gibi araçları kullanarak, bir dereceye kadar doğrudan analiz edebilir ve çizim yapabilirsiniz. Bazen daha da ileri gidiyorum ve üretilen çözümlere karşı doğrudan sympy kullanarak test etmek için gerekli girdiyi üretiyorum ve sonuçları simülasyon kodumda bir girdi olarak kullanıyorum. Langtangen'in "Hesaplamalı Bilim için Python Scripting" kitabını başlangıç ​​noktası olarak önerebilirim. Burada comp. bilim Python kullanılarak gösterilmektedir.
Christian Waluga

Bu soru konuyla ilgili son derece ayrıntılı görünüyor. Bu, ekmek ve tereyağı hesaplamalı bilim şeyleridir. Bence her başlangıçtaki hesaplama bilimcisi Chenming'in bir noktada yaşadıklarından geçti. Biri için diğer insanların kıçtaki bu her yerde bulunan acıya nasıl yaklaştıklarını görmekle çok ilgileniyorum.
tel

Yanıtlar:


5

TLDR Girişinizi
yönetmek / değiştirmek ve çıktınızı mercanlamak için Python'u, verilerinizi düzenlemek / depolamak için HDF5'i kullanın. İlk bakışta göründüğü kadar karmaşık, SQL-şeyden daha basit olacaktır.

Daha uzun cevap + Örnek
Bu tür durumlarla başa çıkmak için kişisel olarak Python komut dosyası ve HDF5 dosya biçimini bir arada kullanıyorum. Python komut dosyası çalıştırma, çalışma dosyalarınızı değiştirmek için gerekli metin ikamelerini işleyebilir (ve yinelenen çalıştırmaları kontrol edebilir) ve daha fazla komut dosyasıyla çıktı verilerini programınızdan alıp bir HDF5 dosyasına koyabilirsiniz.

HDF5'i az çok tam olarak normal bir dosya sistemi (yani bilgisayarınızdaki dizinler ve alt dizinler kümesi) gibi düşünmek, ancak büyük veri kümelerine kolayca ölçeklendirmek en kolayıdır. Her dizin / alt dizin meta verilerle etiketlenebilir (sizin durumunuzda yalnızca değiştirdiğiniz parametreler veya tüm parametre kümesi). Verilerinizi analiz etme zamanı geldiğinde, meta verilere göre arama yapabilirsiniz.

İşte bunun gibi görünen simülasyon verilerimin (zaten HDF5 biçiminde) bazılarına dayanarak nasıl çalışacağına dair kısa bir örnek:

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.hdf5HDF5 dosyasıdır ve Runxx'ın her biri, belirli bir simülasyondan çıktı verilerini tutan ve ilişkili meta verilerle etiketlenmiş bir alt dizindir. Çalışmalarda arama yapan ve istenen meta verilere sahip olanların listesini döndüren bir python betiği şöyle görünür:

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

Yani ben içeren bir dizinde bir komut satırında mydata.hdf5olsaydım yukarıdaki komut dosyası gibi çalıştırabilirsiniz:

python myscript.py mydata.hdf5 maxSteps 1e7 size 13

komut dosyasına meta verilere sahip herhangi bir çalışmayı kısmen veya tamamen eşleşen bulmasını söyler {'maxSteps':'1e7', 'size':'13'}. Komut dosyası daha sonra istediğiniz gibi ("burada bir şeyler yapın" bölümünde) bu verileri işleyebilir ve ardından şöyle görünecek bir liste yazdırabilir:

["Run01", "Run03"]

Bununla birlikte bir not, HDF5'in verilerinizi yalnızca n boyutlu diziler olarak göstermeniz mümkün olduğunda verileriniz için tamamen doğal bir harita sunacağıdır. Simülasyon çıktılarının bir çeşit dizide olması oldukça yaygındır, bu yüzden bu muhtemelen bir sorun olmayacaktır.

İyi başlangıç ​​noktaları
Python: http://www.openbookproject.net/thinkcs/python/english2e/
HDF5: http://www.h5py.org/docs/


2

Sanırım ciddi önerilerde bulunmak için iş akışınız hakkında biraz daha fazla bilgi sahibi olmamız gerekiyor.

Çalışmalarınıza bir anahtar / değer deposu gibi davranmanızı öneririm. Her çalışma için tüm meta verileriniz için basit bir veritabanı oluşturun ve ardından çalışmanızdaki ilgili bilgileri her bir çıktıya atadığınız bir anahtara ayırın.

En basit durumda, meta veri deponuz için bir metin dosyası kullanırsınız ve her dosyanızla ilgili meta veri satırlarını metin dosyanıza güvenle eklersiniz. Daha sonra çıktı çalışmalarınızı istediğiniz gibi depolayabilirsiniz (tek bir dizin, içeriklerin listelendiği yedeklemeler vb.)

Bu stratejiyi istediğiniz herhangi bir dilde uygulayabilirsiniz, ancak Python'da bu önemsiz olacaktır. Ayrıca, Python'un JSON verilerini okuma ve yazma veya SQL veritabanlarıyla etkileşim kurma yeteneği gibi bazı güzel özelliklerden de yararlanabilirsiniz.

Bu yaklaşım çok basit bir hafif veritabanı uygular. Daha fazla güvenlik garantisi sağlayan daha ağır stratejiler var, ilginizi çekebilecek yeni bir strateji ise SciDB . Veritabanları verileriniz hakkında daha güçlü garantiler sağlar ve daha büyük veri kümeleri için yaklaşımınızı ölçeklendirmenize yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.