Come faccio a memorizzare in modo trasparente i dati nelle fasi intermedie di elaborazione?

3

Sto lavorando con MATLAB su un algoritmo di riduzione del modello. È fondamentalmente una pipeline di elaborazione dei dati.

ckt = generate_ckt(ckt_properties);
freq = generate_fpoints(fconfig);
result = freq_dom_sim(ckt,freq);
red_ckt = run_PRIMA(ckt, red_order);

Ognuna di queste attività è potenzialmente dispendiosa in termini di tempo, dal momento che i dati con cui lavoro sono piuttosto grandi (matrici 10000 × 10000). Quindi in una precedente implementazione avevo tutti questi script separati che dovevo eseguire uno per uno (manualmente o eseguire uno script master). Ognuno di questi ha memorizzato i dati in .mat file. Il prossimo programma leggerà da questo e scriverà il proprio risultato in un'altra directory. E così via.

Quello che vorrei usare è un framework in grado di memorizzare le dipendenze tra varie parti di dati, in modo tale che in qualsiasi momento si possa solo chiedere di generare l'output.

Dovrebbe:

  1. Controlla se la variabile è presente nello spazio di lavoro.
  2. Se lo è, controlla se è coerente con le proprietà previste (controlla con config data)
  3. In caso contrario, carica da file (verrà specificato il percorso esatto per il file).
  4. Verifica se è coerente con le proprietà previste.
  5. In caso contrario, calcolarlo dal comando ad esso associato. (Pre-specificato)

Mi piacerebbe che fosse ricorsivo, in modo tale che eseguissi effettivamente l'ultimo modulo e automaticamente eseguisse verifiche e calcoli effettivamente solo quei pezzi di dati che non sono già disponibili e coerenti.

Puoi dare qualche suggerimento su come progettare questo? Se è già stato chiamato qualcosa (presumo che lo sia) per favore indicatelo.

    
posta Milind R 27.02.2013 - 01:49
fonte

1 risposta

4

Ciò che stai descrivendo nella tua soluzione ideale è molto simile a ciò che è fornito dal make programma e makefile . Un makefile esprime essenzialmente un grafico di dipendenza da un insieme di file di output, attraverso un insieme di file intermedi, a un insieme di file di input, insieme a comandi per trasformare un file in un passaggio successivo.

Sottolineando i nomi per le varie funzioni che hai citato sopra, potresti ottenere qualcosa di simile a questo:

ckt.mat : ckt_properties.mat
    matlab -r generate_ckt.m ckt_properties.mat

freq.mat : fconfig.mat
    matlab -r generate_fpoints.m fconfig.mat

result.mat : ckt.mat freq.mat
    matlab -r freq_dom_sim.m ckt.mat freq.mat

red_ckt.mat : ckt.mat red_order.mat
    matlab -r run_PRIMA.m ckt.mat red_order.mat

Questo significa che ckt.mat dipende da ckt_properties.mat , e puoi generare ckt.mat quando è necessario eseguendo matlab generate_ckt.m ckt_properties.mat sulla riga di comando. "Quando è necessario" significa quando il tempo di modifica della sorgente ( ckt_properties.mat ) è più recente di quello del target ( ckt.mat ).

Ora forse puoi fare tutto con file e makefile, ma questo ti mantiene largamente al di fuori dell'IDE di Matlab. Si potrebbe anche fare qualcosa puramente all'interno di Matlab creando una struttura che imiti gli aspetti del filesystem su cui si basa, vale a dire nomi di file, tempi di modifica e contenuti. In altre parole, crea strutture che uniscono una matrice e un tempo di modifica (magari tenuto come un semplice scalare) sotto un nome. Allora avresti bisogno di un'altra struttura che codifichi le relazioni di dipendenza, che è essenzialmente un elenco di tuple contenenti una struttura di destinazione, un elenco di strutture di origine e una funzione di trasformazione. Tutto questo è fattibile (e potrebbe anche essere stato fatto, non lo so), ma potrebbe essere più semplice usare solo i makefile.

    
risposta data 27.02.2013 - 03:11
fonte

Leggi altre domande sui tag