r - Foreach 代替 for 循环
问题描述
我有一个大型数据库,我编写了一个代码,该代码通过将其嵌套在 for 循环中以滚动方式对其执行相同的计算。我的问题是代码运行时间很长。正如我所读到的,这可能是由 R 默认使用单线程方法引起的。据我所知, foreach 包可以在相当长的时间内加快执行速度,但是,我不确定如何实现它。目前,我的代码看起来像这样,在每次迭代中,我都会对大型数据库的一部分进行子集化,并对这些子集进行各种处理。在迭代结束时,我按时间序列收集输出。这种情况下可以申请foreach吗?
(k in seq(1,5284, 21)) {
fdata <- data[k:(k+251),]
tdata <- data[(k+252):(k+377),]
}
谢谢!
解决方案
这当然是可行的foreach
。根据您的操作系统,您首先必须加载合适的后端(例如 Windows 机器上的 SNOW),然后设置集群。
例子:
library(foreach)
library(doSNOW)
# set number of cores/CPUs to be used
(n_cores <- parallel::detectCores() - 1)
# some example data
dat <- matrix(1:1e3, ncol = 10)
# a set you iterate over
k <- 1:99
# run stuff in parallel
cl <- makeCluster(n_cores)
registerDoSNOW(cl)
result <- foreach(k) %dopar% {
fdata <- dat[k:(k+1), ]
# do computationally expensive stuff with `fdata`
# ... and return something
cumsum(fdata[1,] + fdata[2,])
}
stopCluster(cl)
默认情况下result
将是结果列表。然而,有一些方法可以组合成一个数组或类似的。查看 中.combine
论点的详细信息?foreach
。
推荐阅读
- lambda - 为什么在 Kotlin 中将变量传递给 lambda 有效?
- html - 带有内部 div 的 div 高度和位置显示 inline-block
- java - 如何让 ApplicationContext 识别来自 src/test/java 的 CouchBaseRepositoyr bean?
- android - 将联系人姓名输入android应用程序并保存
- vuejs2 - 使用带有 css 特定复选框的 vue 和 v-model
- html - 将 div 高度扩展到它的孩子(iframe)
- reactjs - ReactJS-只有最新的文本行出现在网页中
- php - 如何使用 Laravel 获取以前的外部链接?
- sql-server - 使用 Entity Framework Core 在 SQL Server 中存储大字符串的最佳实践
- iis-7 - IIS 管理器中的停止服务器是否与 iisReset /stop 相同?