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

标签 matlab file-io concurrency mat-file

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

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

SECOND 如何验证数据是否存在并且没有损坏?我可以使用 exists 但这并不能告诉我数据是否损坏。例如,如果 SECOND 尝试在 FIRST 保存数据时恰好读取数据,exists 会通过,但 LOAD 会给您一个错误提示 - Data Corrupt etc.

谢谢。

最佳答案

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

基本 Matlab 的两个选项。

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

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

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

关于matlab - 验证 .mat 文件存在且未损坏 - Matlab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8839057/

相关文章:

c - Linux (GLNXA64) 使用 mxCreateUninitNumericMatrix R2013b

分配默认数组元素时调用 MATLAB 强制构造函数方法

winapi - 如何取消创建文件

java - 如何知道文件之前是否被处理过

java - 从 JTable 写入文本文件,以及从文本文件读取到 JTable

c - 新Linux内核的epoll是否还存在惊群问题?

java - 'CompletionStage' 和 'CompletableFuture' 有什么区别

c# - 如何使用 CancellationToken 属性?

matlab - 计算矩阵中的行数 - Matlab

MATLAB 在长时间的调试 session 中变慢