我在办公室使用奔腾4HT机器运行R,一些代码需要plyr包,我通常需要等待6-7分钟才能完成脚本运行,而我看到我的处理器只有一半的利用率。
我听说在R中使用多核软件包是为了更好地利用多核处理器,我的案例适合这个吗?
谢谢!
发布于 2010-08-23 17:16:30
有一大堆包可以用来做多层处理。请参阅doMPI
、doSNOW
、doMC
和doSMP
。它们都是运行并行化的其他程序的前端(如MPI/OpenMPI、多核包...)。在Windows上,我有很好的使用doSMP
的体验,而在Linux上,fork看起来很有前途(虽然出现了一些对windows的支持,但有些人对“fork”的模拟有疑问)。
也就是说,我同意文斯的观点,即需要编写plyr
函数来使用并行计算的能力。您可以编写自己的函数来模拟plyr
(或编辑使用%dopar%
的plyr
) (也可以参见foreach
包)。
两个"CPU使用历史“窗口可能意味着两个核心或多线程。例如,我有一个4核的i7-920处理器,但我看到8个历史窗口,因为每个核都是多线程的。
请原谅我的词汇和/或逻辑,但当涉及到这类事情时,我会成为文斯帖子中的那条鱼。
发布于 2010-08-23 16:09:35
这听起来可能是一个愚蠢的问题,但是您的处理器是否有多个内核?据我所知,P4没有,但我对硬件的了解就像鱼对天体物理学的了解一样多。
当您说您的“进程只有一半被使用”时,您是指您正在监控两个核心,并且只有一个核心在使用中,还是单个核心被使用了一半?如果是后者,那么您的应用程序可能是内存受限的(并且可能会占用交换空间),而不是CPU,因此并行化也无济于事。
而且,看起来plyr
包并不使用multicore
包,因此您必须显式地重写plyr
的各个部分才能获得并行化。但是,如果plyr的部分并行到令人尴尬的程度,我打赌它们已经被并行化了。
所以我不认为你的问题是CPU限制的,我认为它是内存限制的(并点击交换)。监控你的内存,也许可以把它移到更高内存的机器上。
希望这能有所帮助!
编辑:
正如我在romunov的答案中所写的那样,
@Vince;HT核心执行2个进程的速度比1个进程快(但比2个核心慢),所以值得进行并行。此外,即使是内存受限的进程也会占用100%的内核。(我的重点)
值得比较吗?在这个等式中还有更多的东西。在探索Python的多处理和线程模块时,我无数次地重写了整个程序-甚至是“容易并行化”的程序-但它们的运行速度变慢了。为什么?打开新的线程、进程、将数据转移到不同的进程等都是有固定成本的。这并不是那么简单;根据我的经验,并行化从来都不是这里谈论的魔术子弹。我认为这些答案具有误导性。
首先,我们讨论的是并行化一个需要"6-7分钟“的任务。除非操作员知道他/她的数据会增长很多,否则并行化甚至不值得花在编程上的时间。在实现并行版本所需的时间内,他/她可能已经完成了100次非并行运行。在我的工作环境中,挂钟时间很重要。这些计算需要考虑到运行时等式中(除非你这样做是为了学习/娱乐)。
其次,如果命中交换空间,最大的减速不是CPU,而是磁盘I/O。即使有一种简单的方法可以让plyr代码实现部分并行化(我怀疑这一点),但与添加更多内存相比,在I/O受限的进程上这样做只会微不足道地加快速度。
例如,我曾经从reshape包中运行了一个命令,演示了这种行为。它是在一台拥有4 4GB内存的多核OS X机器上运行的,几秒钟后它就开始爬行了(嗯,我的整个计算机都在爬行!)在两个核心上使用60-70%的CPU,并使用所有4 4GB的内存。我让它作为实验运行了一个小时,然后杀死了R,然后看到我的内存跳回到了3 3GB的空闲空间。我把它移到了一个512 in的RAM服务器上(是的,我们很幸运拥有它),它在7分钟内就完成了。未更改核心使用量。
https://stackoverflow.com/questions/3545559
复制相似问题