在R中处理大数据集
我的内存有问题,R给出了在R中处理大数据集,r,ff,r-bigmemory,R,Ff,R Bigmemory,我的内存有问题,R给出了无法分配大小为XX Gb的向量的错误消息。我有一大堆netcdf格式的每日文件(12784天),以1305x378(经纬度)网格给出海面温度。这使得每天的分数为493290分,当移除NAs(超过陆上点)时,分数降至约245000分 我的最终目标是从每日文件中为245000个点中的任何一个点构建时间序列,并找到每个点的时间趋势。我的想法是构建一个大数据框架,每行一个点,每列一天(2450000x12784),这样我就可以将趋势计算应用于任何点。但是,在构建这样的数据帧时,正
无法分配大小为XX Gb的向量的错误消息。我有一大堆netcdf格式的每日文件(12784天),以1305x378(经纬度)网格给出海面温度。这使得每天的分数为493290分,当移除NAs(超过陆上点)时,分数降至约245000分
我的最终目标是从每日文件中为245000个点中的任何一个点构建时间序列,并找到每个点的时间趋势。我的想法是构建一个大数据框架,每行一个点,每列一天(2450000x12784),这样我就可以将趋势计算应用于任何点。但是,在构建这样的数据帧时,正如预期的那样,出现了内存问题
首先,我尝试了一个我以前用来读取数据的脚本,通过读取nc文件然后融化数据来提取一个三列(lon-lat-sst)数据帧。这会导致在尝试一小段时间后计算时间过长,并导致内存问题。然后,我尝试将每日文件子集为纵向切片;这避免了内存问题,但csv输出文件太大,并且该过程非常耗时
我尝试过的另一种策略到目前为止都没有成功,它是按顺序读取所有nc文件,然后提取每个点的所有每日值并找到趋势。然后我只需要保存一个245000点的数据帧。但我认为这会很耗时,而且不是正确的方法
我一直在阅读big.memory
和ff
程序包,试图声明big.matrix或3D数组(1305 x 378 x 12784),但目前尚未成功
面对这个问题的适当策略是什么
提取单点时间序列以计算单个趋势并填充较小的数据帧
将日常文件分为若干部分,以避免内存问题,但最终会产生大量数据帧/文件
尝试使用bigmemory或ff软件包解决内存问题
提前谢谢你的帮助
编辑1
添加代码以填充矩阵
library(stringr)
library(ncdf4)
library(reshape2)
library(dplyr)
# paths
ruta_datos<-"/home/meteo/PROJECTES/VERSUS/CMEMS/DATA/SST/"
ruta_treball<-"/home/meteo/PROJECTES/VERSUS/CMEMS/TREBALL/"
setwd(ruta_treball)
sst_data_full <- function(inputfile) {
sstFile <- nc_open(inputfile)
sst_read <- list()
sst_read$lon <- ncvar_get(sstFile, "lon")
sst_read$lats <- ncvar_get(sstFile, "lat")
sst_read$sst <- ncvar_get(sstFile, "analysed_sst")
nc_close(sstFile)
sst_read
}
melt_sst <- function(L) {
dimnames(L$sst) <- list(lon = L$lon, lat = L$lats)
sst_read <- melt(L$sst, value.name = "sst")
}
# One month list file: This ends with a df of 245855 rows x 33 columns
files <- list.files(path = ruta_datos, pattern = "SST-CMEMS-198201")
sst.out=data.frame()
for (i in 1:length(files) ) {
sst<-sst_data_full(paste0(ruta_datos,files[i],sep=""))
msst <- melt_sst(sst)
msst<-subset(msst, !is.na(msst$sst))
if ( i == 1 ) {
sst.out<-msst
} else {
sst.out<-cbind(sst.out,msst$sst)
}
}
因此,要在文件备份的大矩阵(FBM)中读取数据,您可以
files <- list.files(path = "SST-CMEMS", pattern = "SST-CMEMS-198201*",
full.names = TRUE)
tmp <- sst_data_full(files[1])
library(bigstatsr)
mat <- FBM(length(tmp$sst), length(files))
for (i in seq_along(files)) {
mat[, i] <- sst_data_full(files[i])$sst
}
文件如果您将所有数据放在一个合适的数据库中并从那里进行查询如何?这可能会运行,但我只掌握数据库的基本知识,而且我还有一个截止日期,如果可能,我更喜欢基于R的解决方案。谢谢。仅通过指定维度(未初始化)创建对象。使用big.matrix
或FBM
。并对第一个维度使用1305*378
。@pacomet AFBM
类似于big.matrix
,但不是一个。所以你不需要这里的大内存。@pacomenop,你必须自己实现它。此外,您应该使用索引作为算法的参数,以便对FBM进行子集,而不是每次使用子集时都创建(复制)另一个FBM。在第一个月创建一个493290行和31列的矩阵,每个月/列的所有点/行,似乎效果良好。我将尝试完整的设置,35年。您好@F.Privé矩阵有问题,我认为备份文件位于我系统的/tmp中,但没有足够的可用空间。它能被移动到有足够磁盘空间的/home吗?@pacomet Yeap,有一个参数用于此。我使用了backingfile参数,它工作正常,请参见问题编辑中的代码
library(bigmemory)
tmp <- sst_data_full(paste0(ruta_datos,files[1],sep=""))
library(bigstatsr)
mat <- FBM(length(tmp$sst), length(files),backingfile = "/home/meteo/PROJECTES/VERSUS/CMEMS/TREBALL" )
for (i in seq_along(files)) {
mat[, i] <- sst_data_full(paste0(ruta_datos,files[i],sep=""))$sst
}
dim(mat)
[1] 493290 12783
mat[1,1]
[1] 293.05
mat[1,1:10]
[1] 293.05 293.06 292.98 292.96 292.96 293.00 292.97 292.99 292.89 292.97
ncol(mat)
[1] 12783
nrow(mat)
[1] 493290
files <- list.files(path = "SST-CMEMS", pattern = "SST-CMEMS-198201*",
full.names = TRUE)
tmp <- sst_data_full(files[1])
library(bigstatsr)
mat <- FBM(length(tmp$sst), length(files))
for (i in seq_along(files)) {
mat[, i] <- sst_data_full(files[i])$sst
}