- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
(这是我第一次尝试创建可重现的示例问题 - 请随时评论以更好的方式来描述或说明问题!)
主要问题声明
我正在使用 foreach
并行训练约 25,000 个模型的%dopar%
和caretList
(来自 caretEnsemble
包)。由于 R 崩溃和内存问题,我需要将每个预测保存为单独的对象,因此我的工作流程如下所示 - 请参阅下面的可重现示例。
cl <- makePSOCKcluster(4)
clusterEvalQ(cl, library(foreach))
registerDoParallel(cl)
multiple.forecasts <- foreach(x=1:1,.combine='rbind',.packages=c('zoo','earth','caret',"glmnet","caretEnsemble")) %dopar% {
tryCatch({
results <- caretList(mpg ~ cyl,data=mtcars,trControl=fitControl,methodList=c("glmnet","lm","earth"),continue_on_fail = TRUE)
for (i in 1:length(results)) {
results[[i]]$trainingData <- c() ## should be trimming out trainingData
}
save(results,file="foreach_results.Rdata") ## export each caretList as its own object
1
},
error = function(e) {
write.csv(e$message,file="foreach_failure.txt") ## monitor failures as needed
0
}
)
}
(IRL 此项目不涉及 mtcars
数据 - foreach
循环的每次迭代都会迭代列表中的数据帧之一,并为每个数据帧保存一个新的预测对象。)
当此对象保存在 foreach
中时循环中,由于压缩,对象大小在 Windows 中约为 136 KB。
但是,当创建并保存此对象时,不使用 foreach
,像这样:
results <- caretList(mpg ~ cyl,data=mtcars,trControl=fitControl,methodList=c("glmnet","lm","earth"),continue_on_fail = TRUE)
for (i in 1:length(results)) {
results[[i]]$trainingData <- c()
}
save(results,file="no_foreach_results.Rdata")
该对象大致相同,在 Windows 中大约为 156KB。那么 Windows 中保存的对象大小会增加什么?
在实际工作流程中,较小的非foreach
对象平均约为 4 MB,较大的 foreach
对象平均为 10 MB,因此当我保存大约 25,000 个这些文件时,这会产生真正的存储问题。
注释
save
foreach
内保存整个环境:而不只是保存对象,即使使用 saveRDS
命令这样做也是如此(见下文),导出到每个工作人员的环境都有一些隐式保存。Trim
似乎不适用于 caretList
:trim
trainControl
选项似乎没有修剪它应该做的事情,因为我必须手动添加命令来修剪 trainingData
.save
压缩为xz
:我需要 foreach 循环来利用多核,因此我需要更大的对象。然而,这会使工作流程减慢约 3-4 倍,这就是我寻找解决方案的原因。caret
中的问题。并行化:参见答案here .SaveRDS
对问题没有帮助:我已经使用 saveRDS
进行了测试而不是save
,但对象大小的差异无处不在。tryCatch
无济于事:即使没有tryCatch
在 foreach
循环中,对象大小的差异无处不在。技术细节
可重现的示例:
library(caret)
library(caretEnsemble)
## train a caretList without foreach loop
fitControl <- trainControl(## 10-fold CV
method = "repeatedcv",
number = 10,
## repeated ten times
repeats = 10,
trim=TRUE)
results <- caretList(mpg ~ cyl,data=mtcars,trControl=fitControl,methodList=c("glmnet","lm","earth"),continue_on_fail = TRUE)
for (i in 1:length(results)) {
results[[i]]$trainingData <- c()
}
object.size(results) ##returns about 546536 bytes
save(results,file="no_foreach_results.Rdata") ##in Windows, this object is about 136 KB
## train a caretList with foreach loop
library(doParallel)
cl <- makePSOCKcluster(4)
clusterEvalQ(cl, library(foreach))
registerDoParallel(cl)
multiple.forecasts <- foreach(x=1:1,.combine='rbind',.packages=c('zoo','earth','caret',"glmnet","caretEnsemble")) %dopar% {
tryCatch({
results <- caretList(mpg ~ cyl,data=mtcars,trControl=fitControl,methodList=c("glmnet","lm","earth"),continue_on_fail = TRUE)
for (i in 1:length(results)) {
results[[i]]$trainingData <- c()
}
save(results,file="foreach_results.Rdata") ## in Windows, this object is about 160 KB
## loading this file back in and running object.size gives about 546504 bytes, approximately the same
1
},
error = function(e) {
write.csv(e$message,file="foreach_failure.txt")
0
}
)
}
sessionInfo() 输出:
R version 3.2.2 (2015-08-14)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows Server 2012 x64 (build 9200)
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] parallel stats graphics grDevices utils datasets methods base
other attached packages:
[1] doParallel_1.0.10 iterators_1.0.8 earth_4.4.4 plotmo_3.1.4 TeachingDemos_2.10
[6] plotrix_3.6-2 glmnet_2.0-5 foreach_1.4.3 Matrix_1.2-4 caretEnsemble_2.0.0
[11] caret_6.0-64 ggplot2_2.1.0 RevoUtilsMath_8.0.1 RevoUtils_8.0.1 RevoMods_8.0.1
[16] RevoScaleR_8.0.1 lattice_0.20-33 rpart_4.1-10
loaded via a namespace (and not attached):
[1] Rcpp_0.12.4 compiler_3.2.2 nloptr_1.0.4 plyr_1.8.3 tools_3.2.2
[6] lme4_1.1-11 digest_0.6.9 nlme_3.1-126 gtable_0.2.0 mgcv_1.8-12
[11] SparseM_1.7 gridExtra_2.2.1 stringr_1.0.0 MatrixModels_0.4-1 stats4_3.2.2
[16] grid_3.2.2 nnet_7.3-12 data.table_1.9.6 pbapply_1.2-1 minqa_1.2.4
[21] reshape2_1.4.1 car_2.1-2 magrittr_1.5 scales_0.4.0 codetools_0.2-14
[26] MASS_7.3-45 splines_3.2.2 pbkrtest_0.4-6 colorspace_1.2-6 quantreg_5.21
[31] stringi_1.0-1 munsell_0.4.3 chron_2.3-47
最佳答案
我也不知道为什么,但我想出的解决方法就是运行
rm(训练数据)
从环境中删除任何重型存储 - 例如训练数据集 - 并阻止其保存到磁盘。
(很高兴不仅仅是我一个人对此感到疯狂。)
关于r - 为什么 save 和 saveRDS 在 dopar 中的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38837319/
我在重新保存对象时表现出了 saveRDS 的奇怪行为。这是一个可重现的示例: df <- data.frame(a = c(1,2), b = c(3,4)) saveRDS(df, "test.r
这是一个棘手的问题,因为我无法提供可重复的示例,但我希望其他人可能有处理此问题的经验。 本质上,我有一个函数可以从数据库中提取大量数据,清理并减小大小并循环遍历一些参数以生成一系列 lm 模型对象、参
我正在构建一个 R 包并使用 data-raw和 data存储预定义的库 RxODE楷模。这非常有效。 然而,由此产生的.rda文件每代都在变化。某些模型包含 R 环境,并且序列化似乎包含“创建时间”
我正在尝试在循环中使用 saveRDS,我有一个名为 XDATA 的列表,其中包含 21 个矩阵和一个名为 names 的列表,其中包含我想将这些矩阵保存在其中的 21 个名称。这是我尝试过的两种解决
我的计算集群最近更新到 R 版本 R 3.6.0 并删除了旧版本的 R。我一直在 R 3.4.0 中运行我的项目。我认为这没问题,运行了一些代码,并将 R 3.6.0 session 期间的输出保存为
saveRDS 和 readRDS 是否相应地保存和恢复所有对象的属性,包括由应用程序创建的属性(通过 attr)?我尝试使用这种方法而不是保存和加载,试图找到下面链接的问题的解决方法。然而,情况似乎
我目前有一个非常大的数组(500 个元素,每个元素都有一个 1000 x 20 的矩阵)。我一直在使用 saveRDS 来保存对象。然而,这样做总是需要很长时间。我想知道 save() 是否更快,或者
我经常写saveRDS()大量数据修改后的声明,这促使我立即写 readRDS()将来,可重现编码访问 .RDS 文件以更快地加载到 R .我的手动生成过程 readRDS()来自输入的语句 save
通常我更喜欢使用 saveRDS 保存我的 R 对象这样我以后可以使用 df= readRDS(...) 将它们重新分配给特定变量.有时我想在 stata 中做一些事情。那么有没有办法打开用saveR
(这是我第一次尝试创建可重现的示例问题 - 请随时评论以更好的方式来描述或说明问题!) 主要问题声明 我正在使用 foreach 并行训练约 25,000 个模型的%dopar%和caretList
我是一名优秀的程序员,十分优秀!