限制R

时间:2019-07-19 09:29:24

标签: r core loess

我试图多次使用loess()函数来拟合+-70.000值作为两个变量的函数。我想使用这种拟合趋势来消除数据趋势。我的问题是,一旦启动了黄土功能,R会话就会占用系统上所有可用的内核,而对于同一计算集群上的其他用户,这是不考虑的。

相关代码将类似于以下内容:

# Approximation of the data
df <- data.frame(y = rpois(70000, rnorm(70000, 10, 2)), # y is count data
                 x = 50000 - rpois(70000, 100),
                 z = runif(70000))

# The problematic operation
fit <- loess(y ~ x + z, data = df)

当我在本地计算机上运行此示例时,它仅占用1个内核,但是在群集上,它将占用尽可能多的内核(最多48个)。理想情况下,我会loess()仅在1个内核上运行。

我试图在黄土代码中追踪任何多核参数,但找不到。我知道黄土调用stats:::simpleLoess,后者依次调用C code,后者又调用Fortran代码。我没有使用C或Fortran的经验,也无法弄清楚如何限制此功能的CPU使用率。

有人对我如何限制黄土功能的CPU使用率有任何建议吗?

2 个答案:

答案 0 :(得分:1)

我没有足够的知识来评论所有这些工作原理的细节,但是我知道C ++和FORTRAN for R通常是使用OpenMP framework进行多线程编程的。从经验上讲,我确实知道,如果在启动R之前设置OMP_NUM_THREADS参数,或者在R会话中进行设置,则可以解决您的问题。

假设您要为loess函数使用2个线程。在启动R之前,您需要执行以下操作($表示要在Shell会话中键入此内容):

$ OMP_NUM_THREADS=2 R [whatever other options you use to launch R]

以下是在R中进行操作的方法(>表示交互式R会话):

> Sys.setenv("OMP_NUM_THREADS" = 2)

如果您需要从R中检查变量,则可以执行以下操作(这将返回带有数字的字符向量):

> Sys.getenv("OMP_NUM_THREADS")
# The result in our example will be "2"

出于完整性考虑,如果您希望获得有关这些功能的更多信息,请确保使用?Sys.setenv?Sys.getenv,并查看this site以获得有关OMP_NUM_THREADS的详细信息。 / p>

希望有帮助!

答案 1 :(得分:0)

因此,McG带领我走了一条路,最终使我能够控制内核数,我将其发布为另一个答案。

我愚蠢地忽略了一些细节,即我在RStudio服务器上工作。出于所有其他目的,我确实认为McG的答案会很好。

该答案帮助我正确地找到了Google的字词,并在偶然发现的搜索结果中徘徊了这个thread,这表明RhpcBLASctl软件包具有如下功能来设置核数:

blas_set_num_threads(2)

在运行loess之前在RMarkdown文档中对此进行设置,使我的CPU使用率保持在200%,而随后运行loess函数则以前是有问题的。