2015-05-02 3 views
9

Независимо от того, насколько интенсивным является R-вычисление, оно не использует более 25% процессора. Я попытался установить приоритет rsession.exe на High и даже Realtime, но использование остается неизменным. Есть ли способ увеличить использование ЦП в R, чтобы использовать весь потенциал моей системы, или есть какое-то недоразумение в моем понимании проблемы? Заранее спасибо за помощь.Как я могу заставить R использовать больше процессора и памяти?

P.S .: Ниже приведено скриншот использования ЦП. Screenshot of the CPU usage

+0

У вас есть 4 ядра? Проверьте вкладку «производительность», 1 ядро ​​на 100%? – RaGe

+0

Каковы спецификации вашего компьютера? Какую версию R вы используете? –

ответ

1

R, в большинстве случаев, однопоточный. Если вы не настроите его правильно, вы будете использовать только 1 ядро ​​до 100%. Я предполагаю, что вы используете четырехъядерную машину, так что 1 ядро ​​на 100% будет выглядеть как 25% использования ЦП.

+0

Спасибо за ответ. Но как я могу настроить его для использования всех ядер? Я использую Intel 2-го поколения i5 2440M. Могу ли я вносить изменения в программу или настраивать R? – Suraj

12

База R однопоточная, поэтому ожидается, что на 4-ядерном процессоре ожидается 25% использования. На одной машине Windows можно распространять обработку по кластерам (или ядрам, если хотите), используя либо пакет , либо пакет, и пакет foreach.

Прежде всего, параллельный пакет (входит в R 2.8.0+, не требует установки) предоставляет функции, основанные на пакете снега - эти функции являются расширениями lapply(). И пакет foreach обеспечивает расширение конструкции for-loop - обратите внимание на то, что он должен использоваться с пакетом doParallel.

Ниже приведен краткий пример кластеризации k-сред с использованием обоих пакетов. Идея проста: 1) подгонка kmeans() в каждом кластере, (2) объединение результатов и (3) минимальный выбор tot.withiness.

library(parallel) 
library(iterators) 
library(foreach) 
library(doParallel) 

# parallel 
split = detectCores() 
eachStart = 25 

cl = makeCluster(split) 
init = clusterEvalQ(cl, { library(MASS); NULL }) 
results = parLapplyLB(cl 
         ,rep(eachStart, split) 
         ,function(nstart) kmeans(Boston, 4, nstart=nstart)) 
withinss = sapply(results, function(result) result$tot.withinss) 
result = results[[which.min(withinss)]] 
stopCluster(cl) 

result$tot.withinss 
#[1] 1814438 

# foreach 
split = detectCores() 
eachStart = 25 
# set up iterators 
iters = iter(rep(eachStart, split)) 
# set up combine function 
comb = function(res1, res2) { 
    if(res1$tot.withinss < res2$tot.withinss) res1 else res2 
} 

cl = makeCluster(split) 
registerDoParallel(cl) 
result = foreach(nstart=iters, .combine="comb", .packages="MASS") %dopar% 
    kmeans(Boston, 4, nstart=nstart) 
stopCluster(cl) 

result$tot.withinss 
#[1] 1814438 

Более подробную информацию об этих упаковках и другие примеры можно найти в следующих статьях.

+0

Спасибо за ответ. Итак, изменения должны быть внесены в программу вместо R-конфигурации? Есть ли способ, которым R можно настроить для использования всех ядер? – Suraj

+0

'detectCores()' в параллельном пакете идентифицирует # кластера, доступные на машине. Вышеприведенный пример выполняется на 4-жильном ноутбуке, а его эквивалент одной нити - 'kmeans (Boston, 4, nstart = 100)'. Вместо того, чтобы последовательно выполнять алгоритм 100 раз, параллельная версия запускается 25 раз в каждом кластере. Затем результаты объединяются. | Насколько я искал, код должен быть изменен, если используется R, распределенное CRAN. Вы можете искать это у Revolution Analytics, но я не уверен. –

+0

Ссылки мертвы! – Faridcher