首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中限制loess的多核使用

在R中限制loess的多核使用
EN

Stack Overflow用户
提问于 2019-07-19 17:29:25
回答 2查看 348关注 0票数 2

我多次尝试使用loess()函数将+- 70.000值拟合为两个变量的函数。我想使用这个拟合来对数据进行反趋势分析。我的问题是,一旦我启动loess函数,R会话就会占用系统上的所有可用内核,这对同一计算集群上的其他用户来说是不体贴的。

相关代码类似于以下代码:

代码语言:javascript
复制
# 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)

当我在我的本地机器上运行这个例子时,它只占用一个核心,但是在集群上它需要尽可能多的核心(最多48个)。理想情况下,我会让loess()只在一个内核上运行。

我尝试在loess的代码中跟踪任何多核参数,但我找不到。我知道loess调用stats:::simpleLoess,而后者又调用C code,后者又调用Fortran代码。我没有C或Fortran的经验,也不知道如何限制这个函数的CPU使用率。

有没有人对如何限制loess函数的CPU使用率有什么建议?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-31 07:56:34

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

假设您想为loess函数使用两个线程。在启动R之前,您将执行以下操作($表示在shell会话中键入此命令):

代码语言:javascript
复制
$ OMP_NUM_THREADS=2 R [whatever other options you use to launch R]

以下是如何在R中执行此操作(>表示交互式R会话):

代码语言:javascript
复制
> Sys.setenv("OMP_NUM_THREADS" = 2)

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

代码语言:javascript
复制
> Sys.getenv("OMP_NUM_THREADS")
# The result in our example will be "2"

为了完整性,如果您希望获得有关这些函数的更多信息,请确保使用?Sys.setenv?Sys.getenv,并查看this site以了解有关OMP_NUM_THREADS的详细信息。

希望这能有所帮助!

票数 2
EN

Stack Overflow用户

发布于 2019-08-01 04:31:39

因此,McG引导我走上了一条最终让我能够控制内核数量的道路,我将把它作为另一个答案发布。

有几个细节我愚蠢地忽略了,那就是我正在RStudio服务器上工作。对于所有其他目的,我确实认为McG的答案会很好。

这个答案帮助我向谷歌获取了正确的术语,在浏览搜索结果时,我偶然发现了这个thread,它表明RhpcBLASctl软件包具有如下设置内核数量的功能:

代码语言:javascript
复制
blas_set_num_threads(2)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57109522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档