R版本:3.2.4
RStudio版本:0.99.893
Windows 7
Intel i7
480 GB RAM
str(df)
161976 obs. of 11 variables
我是R的相对新手,没有软件编程背景。我的任务是在数据集上执行群集。
变量已经缩放并居中。我使用以下代码来查找最佳簇数:
d <- dist(df, method = "euclidean")
library(cluster)
pamk.best <- pamk(d)
plot(pam(d, pamk.best$nc))
我注意到系统从不使用超过22%的CPU处理能力。
到目前为止,我已采取以下行动:
rsession.exe
的设置优先级和设置关联性设置Windows任务管理器。但是,出于某种原因,即使我将其设置为高或实时或该列表上的任何其他内容,它也总是回到低位。 Set Affinity 设置显示系统允许R使用所有核心。High Performance
设置电源选项 - &gt; 更改提前功率设置 - &gt; 处理器电源管理至100%。CRAN Task View for High Performance Computing
。我可能错了,但我不认为计算数据集中观测值之间的距离是一个应该并行化的任务,就像在子集中划分数据集并在子集上并行执行距离计算一样在不同的核心上。如果我错了,请纠正我。我有一个选项是对数据集的子集执行群集,然后预测其余数据集的群集成员资格。但是,我想如果我有处理能力和可用内存,为什么我不能在整个数据集上执行聚类!
有没有办法让机器或R
使用更高百分比的处理能力并更快地完成任务?
编辑:我认为我的问题与 R 中的多线程中描述的问题不同,因为我不想在R中运行不同的函数。相反,我是在一个数据集上只运行一个函数,并希望机器使用更多可用的处理能力。
答案 0 :(得分:0)
可能只使用一个核心。
没有自动方式来并行化计算。所以你需要做的是重写R的部分(这里,可能是dist
和pam
函数,应该是C或Fortran代码)来使用多个核心。
或者你使用的是另一种工具,有人已经完成了工作。我是ELKI的忠实粉丝,但它主要是单核心。我认为Julia可能值得一看,因为它更类似于R(它与Matlab非常相似)并且它被设计为更好地使用多核。 当然,也可能有一个R模块并行化。我会看看Rcpp模块,它们非常快。
但快速和可扩展的聚类的关键是避免距离矩阵。请参阅:4核系统产量可能提高3.5倍(通常更少,因为涡轮增压)和8核产生高达6.5倍的性能。但是,如果将数据集大小增加10倍,则需要100倍的内存和计算量。这是一场你无法获胜的比赛,除了聪明的算法
答案 1 :(得分:0)
这是使用多个CPU内核的快速示例。必须像for循环一样拆分任务,但是直到完全执行循环后,您才能访问任何中间结果以进行进一步的计算。
library(doParallel)
registerDoParallel(cores = detectCores(all.tests = FALSE, logical = TRUE))
这将是您如何拆分任务的基本示例:
vec = c(1,3,5)
do = function(n) n^2
foreach(i = seq_along(vec)) %dopar% do(vec[i])
如果do()函数中需要软件包,则可以通过以下方式加载它们:
foreach(i = seq_along(vec), .packages=c(some packages)) %dopar% do(vec[i])