在R中读取大型HDF5文件

时间:2013-11-27 00:17:32

标签: r hdf5

我最近在R中使用'rhdf5'软件包,并且在我尝试读取190Mb或更大的文件之前发现它非常有用。特别是,我从数据库中获取数据,写入HDF5格式(成功,无论大小),然后稍后再读回R.当我的文件大小超过190Mb时,我收到以下错误:

错误:来自C堆栈溢出的段错误

就我而言,这对应于一个大约1950000行的数据帧。

在阅读包文档时,我认为分块数据可能会解决问题。但是,分块似乎不适用于复合数据帧。这是一些示例代码:

# save a matrix with chunking: works
  mat = cbind(1:10, 11:20)
  h5createFile("test.h5")
  h5createDataset(file="test.h5", dataset="dat", dim=c(10,2), chunk=c(5,2), level=7)
  h5write(mat, file="test.h5", name="dat")

# convert to data frame: won't work now
  df = as.data.frame(mat)
  df[,2] = as.character(mat[,2])
  h5createFile("test2.h5")
  h5createDataset(file="test2.h5", dataset="dat", dim=c(10,2), chunk=c(5,2), level=7)
  h5write(df, file="test2.h5", name="dat")
  #h5write(df, file="test2.h5", name="dat", index=list(1:10, 1:2))

# try to use alternate function
  fid = H5Fcreate("test3.h5")
  h5createDataset(file="test3.h5", dataset="dat", dim=c(10,2), chunk=c(5,2), level=7)
  h5writeDataset.data.frame(df, fid, name="dat", level=7, DataFrameAsCompound=FALSE)
  #h5writeDataset.data.frame(df, fid, name="dat", level=7, DataFrameAsCompound=FALSE, index=list(1:10,1:2))

分块可能无济于事。无论哪种方式,如果有人有关于将大型HDF5文件读入R的建议,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

一个简单的解决方法是在启动R之前增加C堆栈大小。您可以通过ulimit -s 16384执行此操作(假设ulimit -s打印8192这是典型的;您可以选择自己的值)。有关详情,请参阅此处:https://stackoverflow.com/a/14719448/4323

答案 1 :(得分:0)

你想要它用于MODIS吗?我几乎解决了同样的问题,但后来我在GeoTIFF中下载了MODIS栅格。更容易。但是如果你坚持,那么有一个MRT - Modis Reprojection Tool - 命令行工具可以将HDF转换为其他格式,你可以在R中打开。我认为你提到的R中的HDF支持必须是新的,还没有很好地调试,因为几个月前我做了一些研究,许多资源得出结论,R没有支持。另见MODIS in R tutorial

其他资源:

http://www.r-bloggers.com/modis-r-package-tutorial/

http://www.spatial-analyst.net/wiki/?title=Download_and_resampling_of_MODIS_images