Запустите параллельный цикл, который начинается в самой последней точке на векторе симуляции - PullRequest
0 голосов
/ 14 декабря 2018

Я запускаю серию симуляций.Эта серия симуляций занимает много часов.Иногда компьютер падает, или мне нужно остановить симуляции, чтобы сделать что-то еще с моим компьютером.Чтобы обойти эту проблему, я написал некоторый код, который проверяет папку, в которой сохраняются результаты моделирования, и запускает моделирование, следующее за последним сохраненным моделированием.Такие перерывы не имеют значения.

Однако, поскольку процесс медленный, я хотел бы распараллелить его, сохраняя при этом возможность останавливать и перезапускать процесс при последней полной имитации.

Ниже приведен пример одноядерного процесса.

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)
}

Как распараллелить этот процесс, сохранив при этом возможность его остановить и перезапустить без проблем?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...