在没有加载的情况下检查 MAT 文件是否损坏

check if MAT file is corrupt without load

我有一个包含大量 .mat 个文件的数据集。每个 .mat 文件都相当大,即加载它们非常耗时。不幸的是,其中一些文件已损坏,并且这些文件出现 load('<name>') returns 错误。我已经实施了一个 try-catch 例程来确定哪些文件已损坏。然而,考虑到只有少数文件损坏的情况,加载每个文件并检查它是否损坏是很费时间的。有什么方法可以在不使用 load('<name>') 的情况下检查 .mat 文件的运行状况?

我在任何地方都找不到这样的解决方案。

matfile 函数用于访问 MAT 文件中的变量,而无需将它们加载到内存中。通过将 try-catch 例程更改为使用 matfile 而不是 load,可以减少将大文件加载到内存中的开销。

由于 matfile 似乎只在读取损坏的文件时发出警告,您必须检查是否发出了此警告。这可以使用 lastwarn 来完成:在调用 matfile 之前清除 lastwarn,然后检查是否发出警告:

lastwarn('');
matfile(...);
[~, warnId] = lastwarn;
if strcmp(warnId, 'relevantWarningId')
    % File is corrupt
end

你必须先找到相关的警告id,通过运行上面的代码在损坏的文件上,并保存warnId

更可靠的解决方案是在创建文件时计算校验和或哈希值(例如 MD5),并在读取文件之前比较此校验和。