验证 .mat 文件是不是存在且未损坏 - Matlab

Posted

技术标签:

【中文标题】验证 .mat 文件是不是存在且未损坏 - Matlab【英文标题】:Verify .mat file exists and is not Corrupt - Matlab验证 .mat 文件是否存在且未损坏 - Matlab 【发布时间】:2012-02-08 23:26:39 【问题描述】:

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

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

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

谢谢。

【问题讨论】:

您在使用并行计算工具箱吗? 【参考方案1】:

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

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

另外,试着输入

showdemo('paralleldemo_communic_prof')

在 Matlab 中

【讨论】:

【参考方案2】:

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

基本 Matlab 的两个选项。

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

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

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

【讨论】:

谢谢!建议#2 和 3 都有帮助。刚刚设法使用 matlab dos 运算符重命名文件。 您可以在 matlab 中使用movefile 命令重命名文件。无需使用 DOS,这将使您的代码特定于平台。

以上是关于验证 .mat 文件是不是存在且未损坏 - Matlab的主要内容,如果未能解决你的问题,请参考以下文章

matlab怎么将100个图像存在1个mat文件里

如何在 MATLAB 中将 .mat 文件内容保存在内存中?

如何打开MATLAB里的后缀名为mat的文件?

Matlab中.mat文件,需要遍历变量,怎么做?

python读取mat文件

matlab 存储mat文件