Pregunta

Tengo 2 trabajadores de Matlab independientes, con primero obtener/ahorrar datos y leerlo (y hacer algunos cálculos, etc.).

Primero guarda datos como archivo .mat en el disco duro, mientras que el segundo lo lee desde allí. Tarda ~ 20 segundos para SAVE estos datos como .mat y 8millisec a DELETE eso. Antes de guardar datos, primero elimina el archivo anterior y luego guarda una versión más nueva.

¿Cómo puede el segundo verificar que existan datos y is not corrupt? Puedo usar exists Pero eso no me dice si los datos son corruptos o no. Para EG, si el segundo intenta leer datos exactamente cuando los guardan por primera vez, exists pase pero LOAD le da un error que dice: los datos corruptos, etc.

Gracias.

¿Fue útil?

Solución

No puede, sin algún mecanismo de sincronización: para cuando el segundo complete su verificación y comience a leer el archivo, primero podría haber comenzado a escribirlo nuevamente. Necesita algún tipo de bloqueo o mutex.

Dos opciones para Base MATLAB.

Si esto está en un sistema de archivos local, puede usar un archivo de bloqueo separado que se encuentra junto al archivo de datos para administrar el acceso concurrente al archivo de datos. Use los objetos NIO Filechannel y Filelock de Java desde dentro de MATLAB para bloquear el primer byte del archivo de bloqueo y úselo como un semáforo para controlar el acceso al archivo de datos, por lo que el lector espera hasta que el escritor esté terminado y viceversa. (Si esto está en un sistema de archivos de red, no intente esto: el bloqueo de archivos puede parecer funcionar, pero generalmente no es compatible oficialmente y en mi experiencia no es confiable).

O podrías poner un intento/atrapar tu load() Llame y haga que pause unos segundos y vuelva a intentarlo si recibe un error de archivo corrupto. El formato de archivo .mat es tal que no obtendrá una lectura parcial si el escritor todavía lo está escribiendo; Obtendrá ese error de archivo corrupto. Entonces podría usar esto como una especie de detección de colisión y retroceso de colisión. Esto es lo que normalmente hago.

Para reducir la ventana de contención, considere que primero escriba a un archivo temporal en el mismo directorio, y luego use un cambio de nombre para moverlo a su destino final. De esa manera, el archivo solo no está disponible durante una operación de movimiento de sistema de archivos rápido, no en los 20 segundos de la escritura de datos. Si tiene múltiples escritores, pegue el PID y el nombre de host en el nombre del archivo TEMP para evitar colisiones.

Otros consejos

Suena como un problema clásico para compartir recursos entre 2 hilos (RW)

En resumen, debe encontrar un método de comunicación segura entre trabajadores. Controlar esto afuera.

Además, intenta escribir

showDemo ('paralleldemo_communic_prof')

en Matlab

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top