2017-01-20 12 views
0

Ну, я не думаю, что кто-нибудь понял вопрос ...R foreach doParallel with 1 worker/thread

У меня динамический скрипт. Иногда он будет перебирать список из 10 вещей, и иногда он будет перебирать только одну вещь.

Я хочу использовать foreach, чтобы запустить скрипт параллельно, когда элементы для итерации превышают 1. Я просто хочу использовать 1 ядро ​​для каждого элемента для итерации. Итак, если есть 5 вещей, я буду параллель через 5 потоков.

Мой вопрос: что происходит, когда список для итерации равен 1?

Лучше НЕ запускать параллельно и иметь максимальную пропускную способность машины? Или я могу назначить мой сценарий 1 работнику, и он будет работать так же, как если бы я не говорил, чтобы он работал параллельно?

ответ

1

Так позволяет назвать «количество вещей, которые вы перебором» iter, которые вы можете установить динамически для различных процессов

сценарии распараллеливание может выглядеть примерно так

if(length(iter)==1){ 
    Result <- #some function 
} else { 
    cl <- makeCluster(iter) 
    registerDoParallel(cl) 
    Result <- foreach(z=1:iter) %dopar% { 
    # some function 
    } 
    stopCluster(cl) 
} 

Вот если iter 1 он не будет вызывать распараллеливание, иначе он будет динамически назначать ядра в соответствии с числом iter. Обратите внимание: если вы намерены вставить это в функцию, makeCluster и registerDoParallel не могут быть вызваны внутри функции, вы должны установить их вне функции.

В качестве альтернативы вы регистрируете как можно больше кластеров, так как у вас есть узлы, динамически запускайте foreach, а неиспользуемые кластеры просто останутся без дела.

EDIT: Лучше запускать НЕ, чтобы работать параллельно, если у вас есть только одна операция для итерации. Если только во избежание дополнительного времени, вызванного makeCluster(), registerDoParallel() и stopCluster(). Но разница будет мала по сравнению с параллелью с одним работником. Измененный код выше добавления условного экрана для случая только одного работника. Если вам нужна дополнительная помощь, сообщите ниже.

+0

Я отредактировал OP –

+0

Ответ отредактирован соответственно – JustGettinStarted

+0

Если вы удовлетворены ответом, пожалуйста, нажмите галочку, чтобы указать, что этот вопрос сейчас закрыт – JustGettinStarted