2012-01-12 30 views
6

Tengo 2 trabajadores independientes de Matlab, con PRIMERO obteniendo/guardando datos y SEGUNDO leyéndolo (y haciendo algunos cálculos, etc.).Verifique que el archivo .mat exista y no esté Corrupto - Matlab

FIRST guarda datos como archivo .mat en el disco duro mientras SECOND lo lee desde allí. Tarda ~ 20 segundos en SAVE esta información como .mat y 8millisec en DELETE. Antes de guardar datos, FIRST borra el archivo anterior y luego guarda una versión más nueva.

¿Cómo puede el SEGUNDO verificar que los datos existen y is not corrupt? Puedo usar exists pero eso no me dice si los datos están corruptos o no. Por ejemplo, si SECOND intenta leer datos exactamente cuando FIRST lo está guardando, exists pasa, pero LOAD le da un error que dice - Data Corrupt etc.

Thanks.

+0

¿Está utilizando la Parallel Computing Toolbox? –

Respuesta

7

No se puede, sin algún mecanismo de sincronización - por segunda vez completa su cheque y comienza a leer el archivo, FIRST podría haber comenzado a escribirlo nuevamente. Necesitas algún tipo de bloqueo o mutex.

Dos opciones para la base Matlab.

Si se trata de un sistema de archivos local, podría utilizar un archivo de bloqueo separado al lado del archivo de datos para administrar el acceso concurrente al archivo de datos. Utilice los objetos NIO FileChannel y FileLock de Java desde Matlab para bloquear el primer byte del archivo de bloqueo y usarlo como un semáforo para controlar el acceso al archivo de datos, de modo que el lector espere hasta que el escritor finalice y viceversa. (Si esto está en un sistema de archivos de red, no intente esto - el bloqueo de archivos puede parecer que funciona, pero generalmente no es compatible oficialmente y en mi experiencia no es confiable.)

O simplemente podría probar/capturar su load() llame y póngalo en pausa unos segundos y vuelva a intentarlo si obtiene un error de archivo corrupto. El formato de archivo .mat es tal que no obtendrá una lectura parcial si el escritor todavía la está escribiendo; obtendrá ese error de archivo corrupto. Entonces podrías usar esto como un tipo perezoso de detección de colisión y retroceso. Esto es lo que suelo hacer.

Para reducir la ventana de contención, considere tener FIRST escribir en un archivo temporal en el mismo directorio, y luego usar un rename para moverlo a su destino final. De esta forma, el archivo solo no estará disponible durante una operación de traslado rápido del sistema de archivos, no a los 20 segundos de escritura de datos. Si tiene varios escritores, pegue el PID y el nombre de host en el nombre del archivo temporal para evitar colisiones.

+0

Gracias! Las sugerencias n. ° 2 y 3 son útiles. Solo pude cambiar el nombre de un archivo usando el operador 'dos' de matlab. – Maddy

+0

puede cambiar el nombre de los archivos desde dentro de matlab utilizando el comando 'movefile'. No es necesario usar DOS, lo que haría que tu código sea específico de la plataforma. –

1

suena como un problema clásico de distribución de los recursos entre los 2 hilos (R-W)

En resumen, usted debe encontrar un método de interrelaciones trabajadores comunicación segura. Compruebe this out.

Además, trate de escribir

showdemo ('paralleldemo_communic_prof')

en Matlab

Cuestiones relacionadas