G'day,我正在处理一个大型数据集,其中包含约125,000个lon / lat位置和日期,用于物种存在/缺失记录。对于每个地点,我想弄清楚日期和日期前3个月内每个地点的天气状况。为此,我已经下载了在采集数据的5年期间给定天气变量(例如,最高温度)的每日天气数据。我总共有1,826个光栅文件,全部在2-3mb之间。
我原计划堆叠所有光栅文件,然后从每个光栅(1,826)中为每个点提取一个值。这将产生一个巨大的文件,我可以用它来搜索我需要的日期。但是,这是不可能的,因为我无法堆叠那么多栅格。我尝试将栅格分成500个堆叠,这可行,但它产生的文件大约是1Gb而且很慢(行,125,000;列,500)。此外,当我尝试将所有这些文件都放入R来创建一个大数据框时,它不起作用。
我想知道是否有办法在R中处理这么多数据,或者是否有一个我可以用来帮助的包。我可以使用像ff这样的包吗?有没有人有任何建议采用功耗较低的方法来做我想做的事情?我曾经考虑过像lapply函数这样的东西,但之前从未使用过,我不确定从哪里开始。
任何帮助都会非常棒,感谢您的时间。我目前使用的代码没有成功,如下所示。
亲切的问候, 亚当
library(raster)
library(rgdal)
library (maptools)
library(shapefiles)
# To create weather data files, first set the working directory to the appropriate location (i.e., maxt)
# list of raster weather files
files<- list.files(getwd(), pattern='asc')
length(files)
memory.size(4000)
memory.limit(4000)
# read in lon/lat data
X<-read.table(file.choose(), header=TRUE, sep=',')
SP<- SpatialPoints(cbind(X$lon, X$lat))
#separate stacks into mannageable sizes
s1<- stack(files[1:500])
i1 <- extract( s1,SP, cellnumbers = True, layer = 1, nl = 500)
write.table(i1, file="maxt_vals_all_points_all_dates_1.csv", sep=",", row.names= FALSE, col.names= TRUE)
rm(s1,i1)
s2<- stack(files[501:1000])
i2 <- extract( s2,SP, cellnumbers = True, layer = 1, nl = 500)
write.table(i2, file="maxt_vals_all_points_all_dates_2.csv", sep=",", row.names= FALSE, col.names= TRUE)
rm(s2,i2)
s3<- stack(files[1001:1500])
i3 <- extract( s3,SP, cellnumbers = True, layer = 1, nl = 500)
write.table(i3, file="maxt_vals_all_points_all_dates_3.csv", sep=",", row.names= FALSE, col.names= TRUE)
rm(s3,i3)
s4<- stack(files[1501:1826])
i4 <- extract( s4,SP, cellnumbers = True, layer = 1, nl =325)
write.table(i4, file="maxt_vals_all_points_all_dates_4.csv", sep=",", row.names= FALSE, col.names= TRUE)
rm(s4,i4)
# read files back in to bind into final file !!! NOT WORKING FILES ARE TOO BIG!!
i1<-read.table(file.choose(),header=TRUE,sep=',')
i2<-read.table(file.choose(),header=TRUE,sep=',')
i3<-read.table(file.choose(),header=TRUE,sep=',')
i4<-read.table(file.choose(),header=TRUE,sep=',')
vals<-data.frame(X, i1, i2, i3 ,i4)
write.table(vals, file="maxt_master_lookup.csv", sep=",", row.names= FALSE, col.names= TRUE)
答案 0 :(得分:5)
我会一次提取一个光栅文件,然后将结果追加到文件中。
我作弊制作一个矩阵列表,但由于栅格可以采用文件名或矩阵(除其他外),你可以用字符向量上的“[[”索引它在你的情况下应该工作几乎相同。
files <- list(volcano, volcano * 2, volcano * 3)
library(sp)
SP <- SpatialPoints(structure(c(0.455921585146703, 0.237608166502031, 0.397704673508124, 0.678393354622703, 0.342820219769366, 0.554888036966903, 0.777351335399613, 0.654684656824567), .Dim = c(4L, 2L)))
library(raster)
for (i in seq_len(length(files))) {
r <- raster(files[[i]])
e <- extract(r, SP)
## print(e) ## print for debugging
write.table(data.frame(file = i, extract = e),"cellSummary.csv", col.names = i == 1, append = i > 1, sep = ",", row.names = FALSE)
}
答案 1 :(得分:0)
我正在使用并行处理和基于单元格编号的裁剪形式。此函数将采用任何空间点或多边形,并从大型栅格堆栈返回值。这是代码good example for large polygons的变体。
对于我的数据,使用extract需要大约350秒,或者在16核linux服务器上需要32秒。希望它可以帮助别人!
# Define Functions
extract_value_point_polygon = function(point_or_polygon, raster_stack, num_workers){
# Returns list containing values from locations of spatial points or polygons
lapply(c('raster','foreach','doParallel'), require, character.only = T)
registerDoParallel(num_workers)
ply_result = foreach(j = 1:length(point_or_polygon),.inorder=T) %do%{
print(paste('Working on feature: ',j,' out of ',length(point_or_polygon)))
get_class= class(point_or_polygon)[1]
if(get_class=='SpatialPolygons'|get_class=='SpatialPolygonsDataFrame'){
cell = as.numeric(na.omit(cellFromPolygon(raster_stack, point_or_polygon[j], weights=F)[[1]]))}
if(get_class=='SpatialPointsDataFrame'|get_class=='SpatialPoints'){
cell = as.numeric(na.omit(cellFromXY(raster_stack, point_or_polygon[j,])))}
if(length(cell)==0)return(NA)
r = rasterFromCells(raster_stack, cell,values=F)
result = foreach(i = 1:dim(raster_stack)[3],.packages='raster',.inorder=T) %dopar% {
crop(raster_stack[[i]],r)
}
result=as.data.frame(getValues(stack(result)))
return(result)
}
endCluster()
return(ply_result)
}