6

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

FIRST 将数据保存为硬盘上的 .mat 文件,而 SECOND 从那里读取数据。SAVE将这些数据转换为 .mat需要大约 20 秒,而它需要 8 毫秒DELETE。在保存数据之前,首先删除旧文件,然后保存新版本。

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

谢谢。

4

2 回答 2

7

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

基本 Matlab 的两个选项。

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

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

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

于 2012-01-12T18:14:42.870 回答
1

听起来像是 2 个线程 (RW) 之间的经典资源共享问题

总之,你应该找到一种员工间安全沟通的方法。看看这个

另外,尝试输入

showdemo('paralleldemo_communication_prof')

在 Matlab 中

于 2012-01-12T17:25:54.170 回答