在 R 中读取大型 HDF5 文件

Posted

技术标签:

【中文标题】在 R 中读取大型 HDF5 文件【英文标题】:Reading large HDF5 files in R 【发布时间】:2013-12-12 09:32:13 【问题描述】:

我最近一直在使用 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 有建议,我将不胜感激。

【问题讨论】:

对于像这样的问题,如果包似乎存在编码问题,似乎包维护者是最好的联系人 - 他们有兴趣了解并解决这个问题. packageDescription('rhdf5')$Maintainer 【参考方案1】:

您想要它用于 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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于在 R 中读取大型 HDF5 文件的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow - tf.data.Dataset 读取大型 HDF5 文件

在 R 中加载后,我应该如何关闭 hdf5 文件?

torch系列:torch中如何读取存放在hdf5文件中的字符串

使用来自 Python 的 1 个进程使用 HDF5 和 MPI 写入/读取大文件

递归地将 HDF5 文件读入 R

如何将大型多维数组部分写入 HDF5 文件?