Я запускаю серию симуляций.Эта серия симуляций занимает много часов.Иногда компьютер падает, или мне нужно остановить симуляции, чтобы сделать что-то еще с моим компьютером.Чтобы обойти эту проблему, я написал некоторый код, который проверяет папку, в которой сохраняются результаты моделирования, и запускает моделирование, следующее за последним сохраненным моделированием.Такие перерывы не имеют значения.
Однако, поскольку процесс медленный, я хотел бы распараллелить его, сохраняя при этом возможность останавливать и перезапускать процесс при последней полной имитации.
Ниже приведен пример одноядерного процесса.
library(foreach)
library(doMC)
library(dplyr)
library(stringr)
registerDoMC(4)
#Generate seeds
folder <- "DeleteMe"
if(!file.exists(folder)){
dir.create(folder)
}
set.seed(12)
RandNum <- data.frame(ID = 1:100, Random = sample(1:1000, 100))
for (i in 1:nrow(RandNum)) {
CurrentSims <- list.files(folder) %>%
str_replace_all(., "\\D", "" )
NeededSims <- RandNum$ID %>%
str_replace_all(., pattern ="\\D", "" ) %>%
as.numeric()
#The simulations still required in current run
NeededSims2 <- NeededSims[!(NeededSims %in% CurrentSims)]
#minimum ID numnber of remaining sims
NextSim <- min(NeededSims2)
if (NextSim==Inf) break #Stops function making error on last iteration
#Replace this with some long and complicated process that saves to the target folder
RandNum %>%
filter(ID == NextSim) %>%
saveRDS(., file.path(folder, paste0("X", NextSim, ".rds")))
print(i)
}
Кажется, моя попытка создать параллельную версию на самом деле всего лишь 4 раза, но также выдает ошибку
registerDoMC(4)
foreach (i = 1:nrow(RandNum)) %dopar% {
CurrentSims <- list.files(folder) %>%
str_replace_all(., "\\D", "" )
NeededSims <- RandNum$ID %>%
str_replace_all(., pattern ="\\D", "" ) %>%
as.numeric()
#The simulations still required in current run
NeededSims2 <- NeededSims[!(NeededSims %in% CurrentSims)]
#minimum ID numnber of remaining sims
NextSim <- min(NeededSims2)
if (NextSim==Inf) break #Stops function making error on last iteration
RandNum %>%
filter(ID == NextSim) %>%
saveRDS(., file.path(folder, paste0("X", NextSim, ".rds")))
print(i)
}
Как распараллелить этот процесс, сохранив при этом возможность его остановить и перезапустить без проблем?