【发布时间】:2013-12-02 09:07:29
【问题描述】:
在 Linux 3.12.0 上的 R 3.0.2 中,我使用 system() 函数来执行一些任务。如果我通过 Rsystem() 之外的 Rscript 在命令行上执行这些任务,所期望的效果是让每个任务都像它们一样运行。
但是,当通过system() 在 R 中执行它们时,每个任务都绑定到来自主 R 进程的同一个 CPU。
换句话说:
当通过 RScript 直接从 R 外部的 bash shell 启动时,每个任务都尽可能在自己的核心上运行(这是理想的)
当通过system() 在 R 中启动时,每个任务都在同一个内核上运行。没有多核共享。如果我有 100 个任务,它们都卡在一个核心上。
我不知道如何在 R 中生成一个进程,以便每个进程都使用自己的核心。
我正在使用一个简单的测试来消耗 CPU 周期,因此我可以使用 top/htop 测量效果:
dd if=/dev/urandom bs=32k count=1000 | bzip2 -9 >> /dev/null
当这个简单的测试在 R 之外多次启动时,每次迭代都有自己的核心。但是当我在 R 中启动它时:
system("dd if=/dev/urandom bs=32k count=2000 | bzip2 -9 >> /dev/null", ignore.stdout=TRUE,ignore.stderr=TRUE,wait=FALSE)
它们都卡在一个内核上。
这是运行system() 的 4 次同时/并发迭代后的可视化。
请帮助我,我需要能够告诉 R 启动新任务,每个任务都在自己的核心中运行。
2013 年 12 月 4 日更新:
我尝试使用 Python 进行测试:
import thread
thread.start_new_thread(os.system,("/bin/dd if=/dev/urandom of=/dev/null bs=32k count=2000",))
我重复了几次新线程,一切正常(使用多个内核,每个线程一个)。
所以我认为在 R 中安装 rPython 包,并在 R 中尝试相同的操作:
python.exec("import thread")
python.exec("thread.start_new_thread(os.system,('/bin/dd if=/dev/urandom of=/dev/null bs=32k count=2000',))")
不幸的是,即使在重复调用之后,它也再次被限制为单个内核。为什么从 R 执行时,启动的所有内容都仅限于单核?
【问题讨论】:
-
我认为不使用附加包或至少
parallel包是不可能的。你找到here更多解释。 -
您是否在系统上尝试过
GNU parallel?或者,如果您正在运行 4 个进程,您可以尝试在启动脚本中使用xargs和P - 4'4 maxprocs' 选项来尝试强制并行执行?? -
@agstudy,我试过并行包。我什至无法让它正常工作,所以我不知道我的 R 3.0.2 x64 的 Debian 安装是否以某种方式被冲洗掉了,或者是什么。并行仍然仅限于单核。
-
@StephenHenderson,对不起,伙计,我看不出这两种方法在这种情况下是如何工作的。我使用 system() 生成的实际命令都是独一无二的。
-
好的,如果它们是真正独特的,例如diff 命令它不起作用,但通常会运行运行相同命令的文件,例如压缩(您的示例)它们或类似命令,在这种情况下,您可以用文件名列表中的并行或 xargs -P 命令替换循环。也就是说,我从未尝试过它,我不知道它是否有效……虽然我已经从 bash shell 并行运行了多个 Rscript。
标签: multithreading r process multicore