2012-01-12 13 views
6

Ho 2 lavoratori Matlab indipendenti, con PRIMO dati di acquisizione/salvataggio e SECONDO lettura (e alcuni calcoli, ecc.).Verificare che il file .mat esista e non sia corrotto - Matlab

FIRST salva i dati come file .mat sul disco fisso mentre SECONDO li legge da lì. Ci vogliono ~ 20 secondi a SAVE questi dati come .mat e 8millisec a DELETE it. Prima di salvare i dati, FIRST cancella il vecchio file e quindi salva una versione più recente.

Come può il SECOND verificare che i dati esistano e is not corrupt? Posso usare exists ma questo non mi dice se i dati sono corrotti o meno. Ad esempio, se SECONDO tenta di leggere i dati esattamente quando FIRST lo sta salvando, exists passa ma LOAD ti dà un errore dicendo: Data Corrupt ecc.

Grazie.

+0

Stai utilizzando Parallel Computing Toolbox? –

risposta

7

Non è possibile, senza qualche meccanismo di sincronizzazione - per la seconda volta completa la verifica e inizia a leggere il file, FIRST potrebbe aver iniziato a scriverlo di nuovo. Hai bisogno di una sorta di blocco o mutex.

Due opzioni per base Matlab.

Se si trova su un file system locale, è possibile utilizzare un file di blocco separato accanto al file di dati per gestire l'accesso simultaneo al file di dati. Utilizzare gli oggetti NIO FileChannel e FileLock di Java da Matlab per bloccare il primo byte del file di blocco e utilizzarlo come semaforo per controllare l'accesso al file di dati, quindi il lettore attende fino a quando lo scrittore non è terminato e viceversa. (Se questo è su un filesystem di rete, non provarlo - il blocco dei file potrebbe sembrare funzionare ma di solito non è ufficialmente supportato e in base alla mia esperienza non è affidabile.)

Oppure potresti semplicemente provare/aggirare il tuo Chiamare load() e metterlo in pausa alcuni secondi e riprovare se si ottiene un errore di file corrotto. Il formato di file .mat è tale che non si otterrà una lettura parziale se lo scrittore sta ancora scrivendo; otterrai quell'errore di file corrotto. Quindi potresti usare questo come un tipo pigro di rilevamento e backoff delle collisioni. Questo è quello che faccio di solito.

Per ridurre la finestra di contesa, considerare di scrivere FIRST in un file temporaneo nella stessa directory, quindi utilizzare un nuovo nome per spostarlo nella destinazione finale. In questo modo il file non è disponibile durante un'operazione di spostamento del filesystem veloce, non i 20 secondi di scrittura dei dati. Se si dispone di più scrittori, inserire il PID e il nome host nel nome del file temporaneo per evitare collisioni.

+0

Grazie! Il suggerimento n. 2 e 3 sono entrambi utili. È appena riuscito a rinominare un file usando l'operatore 'dos' matlab. – Maddy

+0

è possibile rinominare i file da MATLAB usando il comando 'movefile'. Non c'è bisogno di usare DOS, il che renderebbe il tuo codice specifico per la piattaforma. –

1

suona come un classico problema di condivisione delle risorse tra i 2 filetti (R-W)

In breve, si dovrebbe trovare un metodo di lavoro inter-comunicazione sicura. Controllare this out.

Inoltre, provare a digitare

showdemo ('paralleldemo_communic_prof')

in Matlab

Problemi correlati