2012-01-12 1 views
6

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

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

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

Спасибо.

+0

Вы используете Parallel Computing Toolbox? –

ответ

7

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

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

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

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

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

+0

Спасибо! Предложение № 2 и 3 полезно. Просто удалось переименовать файл с помощью оператора matlab 'dos'. – Maddy

+0

вы можете переименовывать файлы из MATLAB с помощью команды 'movefile'. Нет необходимости использовать DOS, что сделает ваш код специфичным для платформы. –

1

Звучит как классическая проблема совместного использования ресурсов между 2 нитями (R-W)

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

Кроме того, попробуйте ввести

showdemo ('paralleldemo_communic_prof')

в Matlab