2012-10-02 5 views
5

Ich habe das hdf5-Paket erfolgreich auf einem Linux-Rechner installiert. Ich möchte nun Daten aus einer großen Anzahl von hdf5-Dateien in einer Schleife einlesen und eine Zeitreihe erstellen. Jede hdf5-Datei entspricht einer anderen Zeit. Nach dem Einlesen vieler Dateien (knapp über 1000) sagt R, dass zu viele Dateien geöffnet sind. Ich würde gerne einen Weg finden, sie zu schließen, damit die Schleife weiterlaufen kann. Hier ist der Code:Wie soll ich eine hdf5-Datei nach dem Laden in R schließen?

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. 
    } 

Das hdf5 Paket enthält die Funktion hdf5cleanup, die aussieht wie es Dinge reinigen könnte, aber es erfordert eine Dateikennung. Die FID in meinem obigen Code gibt NULL zurück. Versuche, stattdessen den Dateinamen einzufügen, d. H. Hdf5cleanup (fname), führt zum Abbruch von R. Vielleicht soll hdf5load die Datei schließen und schlägt fehl. Wenn dies der Fall ist, gibt es eine Möglichkeit, die Verbindung zu schließen, indem Sie einen Befehl system() oder anderweitig ausgeben?

Zufälligerweise gibt showConnections() nichts zurück, wörtlich nur die Header-Namen "Beschreibung Klasse Modus Text isopen kann lesen kann schreiben".

Meine Frage kurz: Wie schließe ich die Verbindung zu einer hdf5-Datei in R nach dem Laden mit hdf5load()?

+0

Ich 'R' bricht ab, Sie sollten den Betreuer des' hdf5' Pakets kontaktieren, weil das nicht passieren sollte. Der Betreuer kann Ihnen auch den korrekten Aufruf zum Schließen der Dateien mitteilen. –

Antwort

2

HINWEIS: Nach den Kommentaren wird die folgende Antwort nicht funktionieren. Laß es, zumindest für jetzt, einen erfolglosen Weg markieren.


Ich habe nicht hdf5 installiert, so kann ich nicht überprüfen, ob das funktioniert, so ist dies ein bisschen ein Schuss im Dunkeln:

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) 

Die Dokumentation sagt, dass hdf5load nimmt ein Dateiname, aber es kann auch ein Dateihandle sein. Wenn ja, könnte dies funktionieren.

+0

Vielen Dank für Ihre schnelle Antwort! Die open() Funktion ist für die Klasse 'connection' und funktioniert hier nicht. Es gab mir die Idee zu versuchen 'fhandle <- file (description = fname, open =" rb ")' – user1714900

+0

Ich kann die Datei öffnen und schließen mit close (fhandle), aber leider 'hdf5load (fhandle)' gibt den Fehler ' Das erste Argument muss ein Pfadname sein. Für weitere Informationen lautet die Funktion hdf5load: 'function (Datei, load = TRUE, Ausführlichkeit = 0, ordentlich = FALSE) { Aufruf <- sys.call() .External (" do_hdf5load ", Aufruf, sys. Frame (sys.parent()), Datei, laden, as.integer (Ausführlichkeit), as.logical (ordentlich), PACKAGE = "hdf5") } ' – user1714900