Question

J'ai 2 travailleurs indépendants Matlab, avec d'abord obtenir / sauvegarde des données et la lecture SECOND (et faire quelques calculs, etc.).

FIRST enregistre les données sous forme de fichier .mat sur le disque dur tandis que le second lit à partir de là. Il faut environ 20 secondes pour SAVE ces données comme .mat et 8millisec à DELETE il. Avant d'enregistrer des données, supprime d'abord l'ancien fichier et enregistre une version plus récente.

Comment le SECOND vérifier que les données existe et is not corrupt? Je peux utiliser exists mais cela ne me dit pas si les données sont corrompues ou non. Par exemple, si SECOND essaie de lire les données exactement lors de la première est l'enregistrer, mais exists passe LOAD vous donne une erreur disant -. Etc Corrupt données

Merci.

Était-ce utile?

La solution

Vous ne pouvez pas, sans un mécanisme de synchronisation - par le temps SECOND termine son contrôle et commence à lire le fichier, FIRST aurait commencé à l'écrire à nouveau. Vous avez besoin d'une sorte de serrure ou mutex.

Deux options pour Matlab base.

Si cela est sur un système de fichiers local, vous pouvez utiliser un fichier de verrouillage séparé assis à côté du fichier de données pour gérer l'accès simultané au fichier de données. Utilisez les objets Java NIO FileChannel et FileLock à partir de Matlab pour verrouiller le premier octet du fichier de verrouillage et l'utiliser comme un sémaphore pour contrôler l'accès au fichier de données, de sorte que les attentes du lecteur jusqu'à ce que l'écrivain est fini et vice-versa. (Si cela est sur un système de fichiers réseau, ne pas essayer -. Semblent le verrouillage des fichiers peut travailler, mais est généralement pas officiellement pris en charge et mon expérience est peu fiable)

Ou vous pouvez simplement mettre un try / catch autour de votre appel load() et le faire une pause quelques secondes et essayez de nouveau si vous obtenez une erreur de fichier corrompu. Le format de fichier .mat est telle que vous n'obtiendrez une lecture partielle si l'auteur écrit encore; vous obtiendrez cette erreur de fichier corrompu. Ainsi, vous pouvez l'utiliser comme une sorte de paresseux détection de collision et backoff. C'est ce que je fais habituellement.

Pour réduire la fenêtre de contention, envisager d'avoir d'abord écrire dans un fichier temporaire dans le même répertoire, puis utilisez un changement de nom pour le déplacer vers sa destination finale. De cette façon, le fichier est uniquement disponible lors d'une opération de déplacement du système de fichiers rapide, pas les 20 secondes d'écriture de données. Si vous avez plusieurs écrivains, coller le PID et le nom d'hôte dans le nom du fichier temporaire pour éviter les collisions.

Autres conseils

Sons comme un problème de partage des ressources classique entre 2 fils (R-W)

En bref, vous devriez trouver une méthode d'inter-travailleurs une communication sûre. Consultez ceci .

Aussi, essayez de taper

showdemo ( 'paralleldemo_communic_prof')

dans Matlab

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top