我在办公室使用奔腾4 HT机器运行R,一些代码需要plyr包,我通常需要等待6-7分钟才能让脚本完成运行,而我看到我的处理器只是一半利用。
我听说在R中使用Multicore软件包以更好地利用多核处理器,我的情况是否合适呢?
谢谢!
答案 0 :(得分:6)
有很多包来做多路复用。请参阅doMPI
,doSNOW
,doMC
和doSMP
。它们都是运行并行化的其他程序的前端(如MPI / OpenMPI,多核程序包......)。在Windows上,我对doSMP
有很好的体验,而在Linux上,doMC看起来很有前途(有一些支持windows出现,但有些人对模拟“fork”有疑问。)
话虽如此,我同意Vince关于需要编写plyr
函数来使用并行计算能力的评论。您可以编写自己的函数来模拟使用plyr
的{{1}}(或编辑plyr
)(请参阅%dopar%
包)。
两个“CPU使用历史”窗口可能意味着两个核心或多线程。例如,我有一个带有4个内核的i7-920处理器,但是我看到了8个历史窗口,因为每个内核都是多线程的。
请原谅我的词汇和/或逻辑,但是当谈到这些事情时,我会成为Vince的帖子。
答案 1 :(得分:1)
这可能听起来像一个愚蠢的问题,但你的处理器有多个核心吗?我的理解是P4没有,但是我对硬件的了解和天体物理学一样多。
当你说你的“过程只有一半利用”时,你的意思是说你正在监控两个核心,只有一个正在使用,或者一个核心被用了一半?如果它是后者,你的应用程序可能是内存限制(并且可能达到交换空间),而不是CPU,因此并行化将无济于事。
此外,它看起来不像plyr
包使用multicore
包,因此您必须显式重写部分plyr
以获得并行化。但是,如果plyr的部分令人尴尬地平行,我敢打赌它们已经被并行化了。
所以我不认为你的问题是CPU限制的,我认为它是内存限制的(并且触及交换)。监控你的记忆,并将它移到更高的记忆机器上。
希望这有帮助!
编辑:
@Vince正如我在romunov的回答中写的那样; HT核心将执行2个进程 比一个快(但比2慢) 核心),所以值得制作 平行即可。甚至还有内存限制 过程也将占据100%的核心。 (我的重点)
值得并行吗?这个等式中还有更多内容。在探索Python的多处理和线程模块时,无数次我重写了整个程序 - 甚至是“易于并行化”的程序 - 而且它们的运行速度较慢。为什么?打开新线程,进程,将数据转移到不同进程等等都有固定的成本。这并不是那么简单;根据我的经验,并行化永远不会成为这里讨论的神奇子弹。我认为这些答案具有误导性。
首先,我们谈论的是并行化“6-7分钟”的任务。除非OP知道他/她的数据会增长很多,否则并行化甚至不值得编程所需的挂钟时间。在实现并行版本所花费的时间内,他/她可能已完成100次非并行运行。在我的工作环境中,挂钟时间很重要。这些计算需要考虑到运行时方程式(除非你是为了学习/娱乐而做)
其次,如果它正在达到交换空间,那么最大的减速不是CPU,而是磁盘I / O.即使有一种简单的方法来改变plyr代码以使某些部分并行化(我怀疑),在I / O绑定的进程上这样做会比添加更多内存更加平缓。
作为一个例子,我曾经从reshape包中运行了一个命令,它证明了这种确切的行为。它是在具有4GB内存的多核OS X机器上,在几秒钟内它就是爬行(好吧,我的整个计算机都在爬行!),两个内核的CPU占60-70%,并且使用了所有4GB的内存。我让它作为一个小时的实验运行,然后杀了R,看到我的记忆跳回到3GB免费。我把它拖到一个512GB的RAM服务器上(是的,我们很幸运能够拥有它),它在7分钟内完成。没有更改核心使用量。