2012-10-02 41 views
5

He instalado con éxito el paquete hdf5 en una máquina Linux. Ahora deseo leer los datos de una gran cantidad de archivos hdf5 en un ciclo y crear una serie temporal. Cada archivo hdf5 corresponde a una hora diferente. Después de leer en muchos archivos (poco más de 1000), R dice que hay demasiados archivos abiertos. Me gustaría encontrar una forma de cerrarlos para que el ciclo pueda continuar. Aquí está el código:¿Cómo debo cerrar un archivo hdf5 después de cargar en R?

fdate <- "200605312355" # the first date for my test loop 
    fmax <- 1400 
    arr <- vector() 

    for (i in 1:fmax){ 
     fname <- paste(fdate,"_.h5") # path of h5 file 
     fid <- hdf5load(fname) # fid = NULL 
     arr[i] <- somevariable$data_array[lon,lat] 
     # would like to close the file here 
     fdate <- newdate(fdate,60*5) # a function that increments the date by seconds. 
    } 

El paquete contiene el hdf5 hdf5cleanup función, que parece que va a limpiar las cosas, sino que requiere un identificador de archivo. El fid en mi código anterior devuelve NULL. Intenta insertar el nombre del archivo, es decir, hdf5cleanup (fname) lleva a R a abortar. Quizás se supone que hdf5load cierra el archivo y falla. Si ese es el caso, ¿hay alguna forma de cerrar la conexión emitiendo un comando de sistema() o de lo contrario?

Incidentemente, showConnections() no devuelve nada, bueno, literalmente solo los nombres de encabezado "texto de modo de clase de descripción que puede leer puede escribir".

Mi pregunta en resumen: ¿Cómo cierro la conexión a un archivo hdf5 en R después de cargarlo con hdf5load()?

+0

I 'R' se cancela, debe ponerse en contacto con el responsable del paquete' hdf5' porque eso no debería suceder. El mantenedor también puede decirle la invocación correcta para cerrar los archivos. –

Respuesta

2

NOTA: De acuerdo con los comentarios, la siguiente respuesta no funcionará. Dejándolo, al menos por ahora, para marcar una ruta infructuosa a seguir.


no tengo hdf5 instalado, por lo que no puedo comprobar si esto funciona, así que esto es un poco de un tiro en la oscuridad:

fname <- paste(fdate,"_.h5") # path of h5 file 
# fhandle <- open(fname) # Comment pointed out this was not the intended function 
fhandle <- file(description = fname, open = "rb") 
hdf5load(fhandle) # hdf5load returns nothing when load=TRUE (the default) 
arr[i] <- somevariable$data_array[lon,lat] 
close(fhandle) 

La documentación dice que toma hdf5load un nombre de archivo, pero también puede tomar un identificador de archivo. Si es así, esto podría funcionar.

+0

¡Gracias por su pronta respuesta! La función open() es para la clase 'connection', por lo que no funciona aquí. Me dio la idea de probar 'fhandle <- file (description = fname, open =" rb ")' – user1714900

+0

Puedo abrir el archivo y cerrarlo con close (fhandle) pero desafortunadamente 'hdf5load (fhandle)' devuelve el error ' primer argumento debe ser un nombre de ruta'. Para obtener más información, la función hdf5load es: 'función (archivo, carga = VERDADERO, verbosidad = 0, tidy = FALSO) { llamada <- sys.call() .External (" do_hdf5load ", call, sys. frame (sys.parent()), file, load, as.integer (verbosity), as.logical (tidy), PACKAGE = "hdf5") } ' – user1714900

Cuestiones relacionadas