Проверьте .mat -файл существует и не поврежден - Matlab

StackOverflow https://stackoverflow.com/questions/8839057

Вопрос

У меня есть 2 независимых работников Matlab, с первым получением/сохранением данных и вторым чтением (и выполнением некоторых расчетов и т. Д.).

Сначала сохраняет данные как файл .mat в жестком диске, а второй-оттуда. Требуется ~ 20 секунд, чтобы SAVE эти данные как .mat и 8millisec to DELETE Это. Перед сохранением данных сначала удаляет старый файл, а затем сохраняет более новую версию.

Как второе может проверить, что данные существуют и is not corrupt? я могу использовать exists Но это не говорит мне о том, коррумпированы ли данные или нет. Например, если второе попытается точно прочитать данные, когда сначала их сохраняет, exists проходит, но LOAD дает вам ошибку, говорящая - поврежденные данные и т. Д.

Спасибо.

Это было полезно?

Решение

Вы не можете, без какого -либо механизма синхронизации - к тому времени, когда вторая завершает проверку и начинает читать файл, сначала мог бы снова его писать. Вам нужен какой -то блокировка или мутекс.

Два варианта для базового Matlab.

Если это находится в локальной файловой системе, вы можете использовать отдельный файл блокировки, расположенный рядом с файлом данных для управления параллельным доступом к файлу данных. Используйте объекты Java Nio FileChannel и FileLock из Matlab, чтобы заблокировать первый байт файла блокировки и использовать его в качестве семафора для управления доступом к файлу данных, чтобы читатель ожидает, пока писатель не закончится, и наоборот. (Если это в сетевой файловой системе, не попробуйте это - блокировка файлов может показаться, но обычно не поддерживается официально, и, по моему опыту, ненадежна.)

Или вы можете просто попробовать/поймать вокруг своего load() Позвоните и сделайте это за несколько секунд и повторите попытку, если вы получите поврежденную ошибку файла. Формат файла .mat такой, что вы не получите частичное чтение, если писатель все еще пишет его; Вы получите эту поврежденную ошибку файла. Таким образом, вы можете использовать это в качестве ленивого обнаружения столкновений и отключения столкновений. Это то, что я обычно делаю.

Чтобы уменьшить окно раздора, рассмотрите возможность сначала записать во временный файл в том же каталоге, а затем используйте переименование, чтобы переместить его в конечный пункт назначения. Таким образом, файл недоступен только во время быстрого перемещения файловой системы, а не 20 секунд написания данных. Если у вас есть несколько авторов, приведите PID и имя хоста в имя файла Temp, чтобы избежать столкновений.

Другие советы

Похоже на классическую проблему обмена ресурсами между 2 потоками (RW)

Короче говоря, вы должны найти метод безопасного общения между работниками. Проверять это.

Кроме того, попробуйте набрать

ShowDemo ('paralleldemo_communic_prof')

в Matlab

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top