验证.mat文件存在且不是Corrupt - Matlab

时间:2012-01-12 17:00:54

标签: matlab file-io concurrency mat-file

我有两个独立的Matlab工作人员,FIRST获取/保存数据,SECOND读取它(并进行一些计算等)。

FIRST将数据保存为硬盘上的.mat文件,而SECOND则从那里读取数据。将SAVE此数据作为.mat和8millisec到DELETE需要大约20秒。在SAVING数据之前,FIRST删除旧文件,然后保存更新版本。

SECOND如何验证数据是否存在且is not corrupt?我可以使用exists,但这并不能告诉我数据是否已损坏。例如,如果SECOND尝试在FIRST保存时准确读取数据,exists会通过但LOAD会给出错误 - 数据损坏等。

感谢。

2 个答案:

答案 0 :(得分:7)

如果没有一些同步机制,当SECOND完成检查并开始读取文件时,你不能再开始写它了。你需要某种锁或互斥锁。

基础Matlab的两个选项。

如果这是在本地文件系统上,您可以使用位于数据文件旁边的单独锁定文件来管理对数据文件的并发访问。在Matlab中使用Java的NIO FileChannel和FileLock对象来锁定锁定文件的第一个字节,并将其用作信号量来控制对数据文件的访问,因此读者会等到编写器完成后反之亦然。 (如果这是在网络文件系统上,请不要尝试这一点 - 文件锁定似乎可以正常工作,但通常不受官方支持,而且根据我的经验不可靠。)

或者您可以在load()调用周围放置一个try / catch,让它暂停几秒钟,如果出现损坏的文件错误则重试。 .mat文件格式是这样的,如果编写者仍然在写它,你将不会得到部分读取;你会得到那个损坏的文件错误。所以你可以将它用作一种懒惰的碰撞检测和退避。这就是我通常做的事情。

要减少争用窗口,请考虑将FIRST写入同一目录中的临时文件,然后使用重命名将其移动到其最终目标。这样,文件仅在快速文件系统移动操作期间不可用,而不是20秒的数据写入。如果您有多个编写器,请将PID和主机名粘贴在临时文件名中以避免冲突。

答案 1 :(得分:1)

听起来像两个线程(R-W)之间的经典资源共享问题

简而言之,您应该找到一种员工安全沟通的方法。检查this out

另外,尝试输入

  

showdemo('paralleldemo_communic_prof')

在Matlab中