Проверьте .mat -файл существует и не поврежден - Matlab
-
27-10-2019 - |
Вопрос
У меня есть 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