mclapply использует все ядра, но не все потоки

У меня есть 4-ядерный Mac с 8 потоками. Насколько я понимаю mclapply(), он должен использовать 8 потоков в качестве процессоров, но когда я запускаю свой скрипт, я вижу, что работают только 4 потока. В моем примере я использую вложенный список, потому что в моей реальной работе у меня есть 6-уровневый вложенный список, выполнение которого займет несколько дней. Я буду запускать свой скрипт на 24-ядерном Linux, поэтому я пытаюсь понять, как лучше всего использовать свои ресурсы.

library(zoo)

x = replicate(150000, rnorm(24)) 
list1 <- list(elem1 <- x, elem2 <- x)
nested_list <- list(elem1 = list1, elem2 = list1)

mclapply(nested_list, FUN = function(x){
  lapply(x, FUN = function(y){
    rollmean(y, 7)
  })
})

Когда я отслеживаю свои процессоры во время выполнения этого скрипта, я вижу это;

введите здесь описание изображения

Ядра с четными номерами, похоже, вообще не работают, а ядро ​​1, похоже, способно на большее.

Разве mclapply() не так просто заменить lapply()? Фактические функции, которые я использую, взяты из конкретных пакетов, которые мне нужно использовать, поэтому я не могу изменить функции, чтобы они были более эффективными (т.е. использовать dplyr функций вместо base функций). Пожалуйста, посоветуйте, как я могу использовать ресурсы более эффективно.


person nateroe    schedule 03.09.2020    source источник


Ответы (1)


Может ли mclapply и forking вообще ограничиваться памятью? У меня есть скрипт, который я запускаю на 24-ядерном Linux. В начале сценария mclapply(, mc.cores = 18) использовал 18 ядер. В середине сценария, после того как рабочая область стала очень большой (~3,5 ГБ), при использовании mclapply(, mc.cores = 18) будут работать только 2 ядра.

Я очистил память, и это улучшило разветвление. Я попробовал mclapply(, mc.cores = 18), но, наблюдая за использованием ЦП моего ядра, я увидел, что работают только 8 или 9 ядер. Мне интересно, связано ли это все еще с памятью, необходимой для разветвления. Насколько я понимаю, при разветвлении создается новый сеанс R для каждого разветвления. Каждый из этих сеансов затем должен загрузить рабочую область/библиотеку, и это может быть очень интенсивным с точки зрения памяти для большого количества ответвлений. Есть ли способы избежать этого ограничения памяти при работе с большими данными, чтобы лучше распараллелить?

Вот код, который я использовал для очистки памяти;

# Clear plots
if(!is.null(dev.list())) dev.off()
# Clear console
cat("\014") 
# Clean workspace
rm(list=ls())

per http://www.sthda.com/english/articles/17-tips-tricks/75-clear-user-interface-and-free-memory-in-rrstudio/

person nateroe    schedule 06.09.2020