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

Mad*_*ddy 6 concurrency file-io matlab mat-file

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

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

SECOND如何验证数据是否存在is not corrupt?我可以使用exists但不告诉我数据是否损坏.例如,如果SECOND尝试在FIRST保存时准确读取数据,则exists传递但LOAD会给出错误 - 数据损坏等.

谢谢.

And*_*nke 7

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

基础Matlab的两个选项.

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

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

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