что именно делает первый аргумент в функции makeCluster? - PullRequest
2 голосов
/ 26 апреля 2019

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

library(parallel)
#detects number of cores available to use for parallel package
nCores <- detectCores(logical = FALSE)
cat(nCores, " cores detected.")  

# detect threads with parallel()
nThreads<- detectCores(logical = TRUE)
cat(nThreads, " threads detected.")

# Create doSNOW compute cluster (try 64)
# One can increase up to 128 nodes
# Each node requires 44 Mbyte RAM under WINDOWS.
cluster <- makeCluster(128, type = "SOCK")
class(cluster);

Мне нужен кто-то, чтобы помочь мне интерпретировать этот код. Первоначально первый аргумент makeCluster() имел nthreads, но после запуска

nCores <- detectCores(logical = FALSE)

Я узнал, что у меня есть 4 доступные темы. Я изменил значение на основе сообщения, приведенного в руководстве. Позволит ли это мне одновременно выполнить 128 итераций функции поезда одновременно? Если да, то какой смысл получать количество потоков и ядер, которые мой компьютер имеет в первую очередь?

1 Ответ

0 голосов
/ 26 апреля 2019

Что вы хотите сделать, это определить количество ядер, которое у вас есть.

nCores <- detectCores() - 1

В большинстве случаев люди добавляют минус 1, чтобы убедиться, что у вас осталось одно ядро, чтобы делать другие вещи.

cluster <- makeCluster(nCores)

Это установит количество кластеров, на которых вы хотите, чтобы ваш код работал. Существует несколько параллельных методов (doParallel, parApply, parLapply, foreach, ..). Основываясь на выбранном вами параллельном методе, он будет запускаться на одном созданном вами кластере.

Небольшой пример, который я использовал в моем коде

  no_cores <- detectCores() - 1
  cluster <- makeCluster(no_cores)
  result <- parLapply(cluster, docs$text, preProcessChunk)
  stopCluster(cluster)

Я также вижу, что вы используете носок. Не уверен, что "type = SOCK" работает. Я всегда использую "type = PSOCK". FORK также существует, но это зависит от того, какую ОС вы используете.

FORK: "to divide in branches and go separate ways"
Systems: Unix/Mac (not Windows)
Environment: Link all

PSOCK: Parallel Socket Cluster
Systems: All (including Windows)
Environment: Empty
...