Убедитесь, что файл .mat существует и не поврежден - Matlab - PullRequest
6 голосов
/ 12 января 2012

У меня есть 2 независимых работника Matlab, ПЕРВЫЙ получает / сохраняет данные и ВТОРОЙ читает их (и делает некоторые вычисления и т. Д.).

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

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

Спасибо.

Ответы [ 2 ]

7 голосов
/ 12 января 2012

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

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

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

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

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

1 голос
/ 12 января 2012

Похоже на классическую проблему совместного использования ресурсов между двумя потоками (RW)

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

Также попробуйте ввести

showdemo ('paralleldemo_communic_prof')

в Matlab

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...