Параллельное программирование R с двумя циклами и результатами хранения - PullRequest
1 голос
/ 11 июля 2019

У меня есть функция с двумя задействованными циклами, и в результате получается два списка данных.

Структура

function (){
for (i in 1:50){
    for (j in 1:100){
        "Do something"
        "get results a and b"
        a list
        b list
    }
    "use the series of a and b calculate two parameter A and B"
    "put A and B into their list"
    list A = append(list A, A)
'or'list B = cbind(list B, B)   # I don't know which one is better
}
plot the figure using list A and B

"saving the results"
dataframe = df(listA, listB)
dataframe to csv
}

Код должен симулироваться 5000 раз, и каждый шаг занимает не менее 1 минуты:

  1. Я хочу запустить всю эту функцию, используя параллельное программирование; Я пробовал lapply, но он хорошо работает только с одним циклом, если я делаю так, результаты не согласованы, и график не может работать, то есть я не могу получить результаты;

и я обнаружил, что некоторый параллельный код не может работать в Windows, а некоторые не могут работать в Mac, я путаюсь с этими ...

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

  1. Чтобы использовать данные в дальнейших требованиях к графику, мне нужно сохранить результаты, у меня возникли проблемы с этим (верхний здесь), а также с параллельным;

Способ сохранения результатов выглядит как беспорядок. Например, я хочу:

A    B
0    0
0.1  1
1.2  4
3    9
6    12
...  ...

но я получил:

    V1
0    0   0.1  1  1.2  4   3    9  6    12  ... ...

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

1 Ответ

2 голосов
/ 11 июля 2019

Мне нравится использовать пакет foreach для подобных задач (проверьте в документации ). Эта функция похожа на цикл for, но работает в кластере. Таким образом, каждая итерация выполняется отдельно и впоследствии объединяется. Я сделал небольшой пример со структурой, которую вы используете. Вы можете изменить это для своей задачи.

library(foreach)
library(doParallel)
#number of your cluster precessors, i choosed 4
cl <- makeCluster(4)
registerDoParallel(cl)
# use for z=1:10 your range, the .combine declares how to combine your dataframe afterwrads,
#.inorder makes sure it's sorted and the values are in the right order (TRUE is default)
df<-foreach(z = 1:10, .combine=rbind, .inorder=TRUE) %dopar%{
    list_b = list()
    list_a = list()
    for (i in 1:50){
      for (j in 1:100){
        #some random task you are doing
        a = i 
        b = 50-i
      }
      #combining them
      list_b= cbind(list_b, b)
      list_a= cbind(list_a, a)
    }
    #make sure you return the values, otherwise they don't get combined by foreach
    return(do.call(rbind, Map(data.frame, A=list_a, B=list_b)))
}
#foreach returns nested lists, so you can change it to a dataframe easily
df= as.data.frame(df)
View(df)

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