在 R 中加载后,我应该如何关闭 hdf5 文件?
Posted
技术标签:
【中文标题】在 R 中加载后,我应该如何关闭 hdf5 文件?【英文标题】:How should I close an hdf5 file after loading in R? 【发布时间】:2012-09-23 14:28:50 【问题描述】:我已经在一台 linux 机器上成功安装了 hdf5 包。我现在希望循环读取大量 hdf5 文件中的数据并创建一个时间序列。每个 hdf5 文件对应不同的时间。在读入许多文件(刚刚超过 1000 个)后,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.
hdf5 包包含函数 hdf5cleanup,看起来它可以清理东西,但它需要一个文件标识符。我上面代码中的 fid 返回 NULL。尝试插入文件名,即 hdf5cleanup(fname) 导致 R 中止。也许 hdf5load 应该关闭文件并失败。如果是这种情况,有没有办法通过发出 system() 命令或其他方式来关闭连接?
顺便说一句,showConnections() 什么也不返回,嗯,字面上只是标题名称“描述类模式文本 isopen 可以读可以写”。
简而言之我的问题: 使用 hdf5load() 加载 R 中的 hdf5 文件后,如何关闭与它的连接?
【问题讨论】:
我R
正在中止,您应该联系hdf5
包的维护者,因为这不应该发生。维护者也可能会告诉您关闭文件的正确调用。
【参考方案1】:
注意:根据 cmets,以下答案无效。留下它,至少现在是为了标记一条不成功的路线。
我没有安装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
采用文件名,但它也可能采用文件句柄。如果是这样,这可能会起作用。
【讨论】:
感谢您的及时答复! open() 函数用于“连接”类,因此在这里不起作用。它给了我尝试fhandle <- file(description = fname, open = "rb")
的想法
我可以打开文件并使用 close(fhandle) 关闭它,但不幸的是 hdf5load(fhandle)
返回错误 first argument must be a pathname
。如需更多信息,hdf5load 函数为:function (file, load = TRUE, verbosity = 0, tidy = FALSE) call <- sys.call() .External("do_hdf5load", call, sys.frame(sys.parent()), file, load, as.integer(verbosity), as.logical(tidy), PACKAGE = "hdf5")
以上是关于在 R 中加载后,我应该如何关闭 hdf5 文件?的主要内容,如果未能解决你的问题,请参考以下文章