2016-07-12 1 views
0

J'ai un ensemble de données composé d'un grand nombre de fichiers .mat. Chaque fichier .mat est de taille considérable, c'est-à-dire que le chargement prend du temps. Malheureusement, certains d'entre eux sont corrompus et load('<name>') renvoie une erreur sur ces fichiers. J'ai implémenté une routine try-catch pour déterminer quels fichiers sont corrompus. Cependant, étant donné que seule une poignée d'entre eux sont corrompus, charger chaque fichier et vérifier s'il est corrompu prend du temps. Est-il possible de vérifier la santé d'un fichier .mat sans utiliser load('<name>')?vérifier si le fichier MAT est corrompu sans charge

Je n'ai pas réussi à trouver une telle solution n'importe où.

+0

['try'] (http://www.mathworks.com/help/matlab/ref/try.html) pourrait aider je pense – shamalaia

+0

@shamalaia Si j'utilise' load' dans 'try', cela prend du temps . Je cherche une solution sans utiliser 'load' pour gagner du temps. – user3342981

Répondre

2

La fonction matfile permet d'accéder aux variables dans les fichiers MAT, sans les charger en mémoire. En changeant votre routine try-catch pour utiliser matfile au lieu de load, vous réduisez le temps de chargement des gros fichiers dans la mémoire.

Comme matfile semble émettre un avertissement uniquement lors de la lecture d'un fichier corrompu, vous devrez vérifier si cet avertissement a été émis. Cela peut être fait en utilisant lastwarn: clair lastwarn avant d'appeler matfile et vérifier si l'avertissement a été émis après:

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

Vous devez trouver l'identifiant d'avertissement pertinent d'abord, en exécutant le code ci-dessus sur un fichier corrompu et en enregistrant le warnId.

Une solution plus robuste consisterait à calculer une somme de contrôle ou un hachage (par exemple MD5) du fichier lors de la création, et de comparer cette somme de contrôle avant de lire le fichier.

+0

J'ai confirmé avec un fichier MAT corrompu que 'matfile()' n'est pas capable de détecter la corruption. Seulement quand vous accédez aux variables à l'intérieur de l'objet 'matfile', cela donne une erreur. Donc, simplement utiliser 'matfile()' dans try-catch ne fonctionnera pas parce que try-catch n'attrape que l'erreur. Mais les bonnes nouvelles sont que 'matfile()' donne un avertissement lors de la lecture d'un fichier corrompu. Si nous pouvons trouver un moyen de faire des avertissements de catch de routine, c'est la meilleure option. En outre, je trouve votre solution Aliter (en utilisant la valeur de hachage) assez robuste. Merci pour votre réponse. – user3342981

+0

Merci pour les commentaires. J'ai étendu ma réponse avec une solution pour "attraper" l'avertissement. – hbaderts