2012-01-12 229 views
6

我有2名独立的Matlab的工人,先取/保存数据读和二读它(和做一些计算等)。验证.MAT文件存在并且未损坏 - Matlab的

首先保存数据的硬盘,而第二从那里读取它.MAT文件。这个数据需要大约20秒到SAVE这个数据为.mat和8millisec到DELETE它。在保存数据之前,FIRST删除旧文件,然后保存更新的版本。

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

谢谢。

+0

您使用的是并行计算工具箱? – 2012-01-12 18:16:44

回答

7

你不能,没有一些同步机制 - 由时间秒钟内完成其检查并开始读取文件,FIRST可能已经开始再次写入。你需要某种锁或互斥体。

两个选项为基础Matlab的。

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

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

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

+0

谢谢!建议#2和3都有帮助。只是设法使用matlab'dos'运算符重命名一个文件。 – Maddy 2012-01-12 22:50:30

+0

你可以使用'movefile'命令从matlab中重命名文件。不需要使用DOS,这将使您的代码特定于平台。 – 2013-11-23 23:59:44

1

听起来像是2个线程(R-W)

总之之间的经典资源共享的问题,你应该找间工人的方法安全通信。检查this out

此外,尝试键入

showdemo( 'paralleldemo_communic_prof')

在Matlab