【问题标题】:How to resolve error: cannot allocate vector of size 70.7 Gb in RStudio?如何解决错误:无法在 RStudio 中分配大小为 70.7 Gb 的向量?
【发布时间】:2019-10-21 09:00:36
【问题描述】:

我需要将 .nc 文件(大小 35 GB)转换为 .csv。它显示一条错误消息:无法分配大小为 70.7 Gb 的向量

如何解决这个错误?

我已使用与转换较大文件相同的代码成功地将 .nc 文件(大小 4 kb)转换为 .csv 文件。

我尝试在 nc.df... 命令之前使用 gc() 命令清除内存。另外,我尝试如下增加内存限制。

              > memory.limit()
              [1] 16306

              > memory.limit(size = 120000)
              [1] 120000

代码如下:

   > rm(list = ls())
   > library(raster)
   > nc.brick <- brick(file.choose())
   > nc.df <- as.data.frame(nc.brick, xy=T)
   > write.csv(nc.df, file.choose())

预期的结果是使用上面的代码得到一个 .csv 文件。但是,目前,在倒数第二个命令之后(即 nc.df

> sessionInfo()
R version 3.4.0 (2017-04-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200) 

Matrix products: default 

locale: 
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C 
[5] LC_TIME=English_United States.

1252 attached base packages: 
[1] stats graphics grDevices utils datasets methods base 

other attached packages: 
[1] raster_2.5-8 sp_1.2-4 RevoUtilsMath_10.0.0 

loaded via a namespace (and not attached): 
[1] compiler_3.4.0 RevoUtils_10.0.4 rgdal_1.2-7 tools_3.4.0 Rcpp_0.12.10 ncdf4_1.16
[7] grid_3.4.0 lattice_0.20-35

我尝试了库 ff 但它再次给出了同样的错误。

            > rm(list = ls())
            > library(ff)
            > nc.brick <- brick(file.choose())
            > nc.df <- as.data.frame(nc.brick, xy=T) 

【问题讨论】:

  • 您好,您可以发布sessionInfo()的结果吗?
  • @SamuelDiebolt sessionInfo() 结果如下:R 版本 3.4.0 (2017-04-21) 平台:x86_64-w64-mingw32/x64 (64-bit) 运行条件:Windows >= 8 x64(构建 9200)矩阵产品:默认续......
  • 语言环境:[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 [3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C [5] LC_TIME=English_United States.1252 附加基本包: [1] 统计图形 grDevices utils 数据集方法基于其他附加包:[1] raster_2.5-8 sp_1.2-4 RevoUtilsMath_10.0.0 通过命名空间加载(未附加):[1] compiler_3.4.0 RevoUtils_10.0.4 rgdal_1 .2-7 tools_3.4.0 Rcpp_0.12.10 ncdf4_1.16 续...
  • [7] grid_3.4.0 lattice_0.20-35
  • 由于 R 在内存中运行,您是否有足够的可用 RAM 来处理 70GB 以上的数据帧?您还可以尝试使用库来处理大数据帧,例如 ff

标签: r netcdf netcdf4


【解决方案1】:

看着?raster::as.data.frame

如果没有足够的内存来加载所有值,您可以使用 getValues 或 getValuesBlock 来读取文件的块。您也可以先使用 sampleRegular

您可以在循环中使用getValuesgetValuesBlock 按块处理文件(在write.csv 中使用append = TRUE)。

您还可以使用sampleRegular 对您的栅格进行下采样,以使您的栅格更小。只有您可以决定下采样是否适合您的情况。

【讨论】:

  • 如上定义 nc.brick 后,我使用以下代码准备 nc.df 文件: nc.df
  • @Olive 这就是 getValuesBlock 的作用:getValuesBlock(nc.brick, row = 2, nrows = 3, col = 1, ncols = 3)。不是 100% 确定参数名称,但你明白了。
猜你喜欢
  • 2021-04-03
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多