r - 在非常大的数据帧上处理计算的更快方法
问题描述
我正在处理几个数据框,它们都是 61,143 行和 9,864 列。这使得每个数据帧中的值刚刚超过 6 亿。这使得对数据帧的任何计算都非常慢 - 几个小时。例如:
OBS 61143 obs. of 9864 variables
OBS.MAX <- apply(OBS, 1, max)
这些值最初来自 netcdf 文件,然后我将其从栅格砖转换为数据框。有没有更快的方法可以完成上述计算?在这样的数据框架内工作效率低下吗?
解决方案
与一些示例数据交谈总是更容易
library(raster)
b <- brick(ncol=245, nrow=250, nl=9864)
v <- matrix(rep(1:ncell(b), nlayers(b)), ncol=nlayers(b))
values(b) <- v
bb <- writeRaster(b, "test.nc", overwrite=TRUE)
d <- data.frame(v)
现在我得到以下
# matrix
system.time(apply(v, 1, max))
# user system elapsed
# 10.68 0.79 11.46
# data.frame
system.time(apply(d, 1, max))
# user system elapsed
# 20.48 0.61 21.11
# RasterBrick (values in memory)
system.time(max(b))
# user system elapsed
# 6.72 0.29 7.00
system.time(calc(b, max))
# user system elapsed
# 16.76 0.33 17.11
# RasterBrick (values on disk)
system.time(max(bb))
# user system elapsed
# 19.25 8.43 27.70
system.time(calc(bb, max))
# user system elapsed
# 22.69 5.92 28.62
基于此,我将使用RasterBrick
and max
(或calc
更一般地),因为从文件中提取值也需要时间
system.time( values(bb))
# user system elapsed
# 21.91 5.28 27.18
但是很大程度上取决于您的工作流程——例如,每个数据集有多少计算。这些计算需要一段时间,但您报告“几个小时”的计算。这表明问题出在您正在应用的功能中。也许你需要重写这些。
推荐阅读
- android - 如何使用 GSON 库从 JSON 对象创建列表?
- cmake - 无法解决:“cl.exe”无法编译简单的测试程序
- azure - 在 O365 中订阅(公司范围内的)语音呼叫事件
- php - 如何分别获取json结果来调用不同的模态函数?
- lighthouse - 如何解决“主要未定义在...”问题
- amazon-s3 - 我想使用云形成脚本在 7 天到期后从 s3 存储桶中删除特定对象
- javascript - 如何使用 JavaScript 对文本输入执行验证检查?
- swift - 在 SwiftUI Xcode beta 5 中为图像添加带有cornerRadius 的边框
- java - 将 dagger2 与 Retrofit 和 MVVM 一起使用
- spring-boot - Spring Boot(JPA)中的多个@JoinTable