2012-10-02 36 views
5

我已经在Linux机器上成功安装了hdf5软件包。我现在希望从循环中读取大量hdf5文件的数据并创建一个时间序列。每个hdf5文件对应不同的时间。在阅读了很多文件(超过1000个)后,R说太多的文件都打开了。我想找到一种方法来关闭它们,以便循环可以继续。下面是代码:如何在R中加载后关闭hdf5文件?

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

的HDF5包中包含的功能hdf5cleanup,这看起来似乎是干净的东西了,但它需要一个文件标识符。我上面的代码中的fid返回NULL。试图插入文件名,而不是hdf5cleanup(fname)导致R中止。也许hdf5load应该关闭文件并失败。如果是这种情况,是否有任何方法通过发出system()命令或其他方式来关闭连接?

可以肯定的是,showConnections()不返回任何内容,简直就是头文件名称“描述类模式文本isopen可读取可以写入”。

我的问题简而言之: 如何在使用hdf5load()加载后在R中关闭与hdf5文件的连接?

+0

我'R'中止,你应该联系'hdf5'包的维护者,因为这不应该发生。维护者也可以告诉你正确的调用来关闭文件。 –

回答

2

注意:根据评论,以下答案将无法正常工作。至少在现在,留下它来标记一条不成功的路线。


我没有安装hdf5,所以我不能检查,如果这个工程,所以这是一个有点在黑暗中拍摄的:

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) 

文档说hdf5load需要一个文件名,但它也可能需要一个文件句柄。如果是这样,这可能会起作用。

+0

谢谢您的及时答复! open()函数用于类“连接”,所以在这里不起作用。它给了我想法尝试'fhandle < - file(description = fname,open =“rb”)' – user1714900

+0

我可以打开文件并用close关闭它(fhandle),但不幸'hdf5load(fhandle)'返回错误'第一个参数必须是路径名“。有关更多信息,hdf5load函数为: 'function(file,load = TRUE,verbosity = 0,tidy = FALSE) {<} sys.call() .External(“do_hdf5load”,call,sys。 frame(sys.parent()),file, load,as.integer(verbosity),as.logical(tidy),PACKAGE =“hdf5”) } – user1714900