2011-02-09 6 views
2

Je suis en train d'enregistrer un tableau en tant que fichier HDF5 en utilisant R, mais n'ayant pas de chance.Enregistrement dans hdf5save crée un fichier illisible

Pour tenter de diagnostiquer le problème, j'ai exécuté example(hdf5save). Cela a créé avec succès un fichier HDF5 que je pouvais lire facilement avec h5dump.

Lorsque j'ai ensuite exécuté le code R manuellement, j'ai constaté que cela ne fonctionnait pas. Le code que j'ai exécuté était exactement le même que celui qui est exécuté dans le script d'exemple (à l'exception d'un changement de nom de fichier pour éviter l'écrasement). Voici le code:

(m <- cbind(A = 1, diag(4))) 
ll <- list(a=1:10, b=letters[1:8]); 
l2 <- list(C="c", l=ll); PP <- pi 
hdf5save("ex2.hdf", "m","PP","ll","l2") 
rm(m,PP,ll,l2) # and reload them: 
hdf5load("ex2.hdf",verbosity=3) 
m  # read from "ex1.hdf"; buglet: dimnames dropped 
str(ll) 
str(l2) 

et voici le message d'erreur de h5dump:

h5dump error: unable to open file "ex2.hdf" 

Quelqu'un at-il des idées? Je suis complètement perdu.

Merci

Répondre

4

J'ai eu ce problème. Je ne suis pas sûr de la cause et les mainteneurs hdf5 ne le sont pas non plus. Les auteurs du paquet R n'ont pas répondu.

alternatives qui fonctionnent

Dans le temps depuis que je répondais à l'origine, le paquet hdf5 a été archivé, et des solutions de rechange appropriées (h5r, rhdf5 et ncdf4 ) have been created; I am currently using ncdf4`:

  1. Depuis netCDF -4 utilise hdf5 en tant que couche de stockage, le paquet ncdf4 fournit une interface à la fois netCDF-4 et hdf5
  2. Le package h5r avec R> = 2.10
  3. le package rhdf5 est disponible sur BioConductor.

Deux solutions de contournement __gVirt_NP_NNS_NNPS<__ contournements fonctionnels mais peu satisfaisants que j'ai utilisé avant de trouver les solutions ci-dessus:

  1. R 2.7 Installez la version 1.6.6 hdf5, R hdf5 v1.6.7, et la version zlib1g 1: 1.2. 3.3 et l'utiliser lors de l'écriture des fichiers (c'était ma solution jusqu'à la migration vers la bibliothèque ncdf4).
  2. Utilisation h5totxt à la ligne de commande du [hdf5utils] [1] programme (nécessite l'utilisation de bash et réécrire votre code R)

Une démonstration minimale, reproductible de la question:

ici est un exemple reproductible qui envoie une erreur

Première session R

library(hdf5) 
dat <- 1:10 
hdf5save("test.h5","dat") 
q() 
n # do not save workspace 

Deuxième session R:

library(hdf5) 
hdf5load("test.h5") 

sortie:

HDF5-DIAG: Error detected in HDF5 library version: 1.6.10 thread 
47794540500448. Back trace follows. 
#000: H5F.c line 2072 in H5Fopen(): unable to open file 
    major(04): File interface 
    minor(17): Unable to open file 
#001: H5F.c line 1852 in H5F_open(): unable to read superblock 
    major(04): File interface 
    minor(24): Read failed 
#002: H5Fsuper.c line 114 in H5F_read_superblock(): unable to find file 
signature 
    major(04): File interface 
    minor(19): Not an HDF5 file 
#003: H5F.c line 1304 in H5F_locate_signature(): unable to find a valid 
file signature 
    major(05): Low-level I/O layer 
    minor(29): Unable to initialize object 
Error in hdf5load("test.h5") : unable to open HDF file: test.h5 
+0

Merci pour vos solutions, je pense que votre deuxième option me convient le mieux. Je n'ai pas trouvé le programme hdf5tools, mais j'ai trouvé [h5utils] (http://ab-initio.mit.edu/wiki/index.php/H5utils) qui contient un programme appelé [h5fromtxt] (http: //ab-initio.mit.edu/h5utils/h5fromtxt-man.html) qui semble faire ce que je veux. – matt

+1

@Matt J'ai mis à jour ma réponse, et je voulais dire h5utils, un très bon ensemble d'outils. J'ai trouvé que 'h5totxt test.h5' fonctionnait sur des fichiers pour lesquels' h5load ('test.h5') 'ne l'avait pas fait (donc l'écriture n'est illisible que par R, pas forcément corrompue). –

+0

Il semble que la commande 'hdf5save' ne fonctionne que de temps en temps, et il ne semble pas y avoir de rime ou de raison. Au moins (grâce à vous) nous avons maintenant un exemple de code reproductible que nous pouvons/nous pouvons apporter à leur bug tracker (ou essayer de le réparer, je suppose que c'est Open Source). Je suis toujours au travail maintenant, mais je le ferai quand je rentrerai à la maison. Cheers, – matt

1

J'ai couru aussi le même problème et a trouvé une solution raisonnable.

Le problème semble provenir de la fin de la bibliothèque hdf5. S'il n'a pas la chance de finaliser le fichier, le fichier est corrompu. Je pense que cela se produit après que le tampon soit vidé mais le tampon ne soit pas toujours vide.

Une solution que j'ai trouvée est de faire le hdf5save dans une fonction séparée. Affectez les variables dans globalenv(), puis appelez hdf5save et quittez la fonction. Lorsque la fonction se termine, la mémoire semble nettoyer ce qui fait que le libraire hdf5 vider le tampon et finaliser le fichier.

Espérons que cela aide!

Questions connexes