我多次尝试使用loess()函数将+- 70.000值拟合为两个变量的函数。我想使用这个拟合来对数据进行反趋势分析。我的问题是,一旦我启动loess函数,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)当我在我的本地机器上运行这个例子时,它只占用一个核心,但是在集群上它需要尽可能多的核心(最多48个)。理想情况下,我会让loess()只在一个内核上运行。
我尝试在loess的代码中跟踪任何多核参数,但我找不到。我知道loess调用stats:::simpleLoess,而后者又调用C code,后者又调用Fortran代码。我没有C或Fortran的经验,也不知道如何限制这个函数的CPU使用率。
有没有人对如何限制loess函数的CPU使用率有什么建议?
发布于 2019-07-31 07:56:34
我没有足够的知识来评论所有这些是如何工作的细节,但我知道R的C++和FORTRAN通常是使用多线程编程的OpenMP framework构建的。根据经验,我确实知道,如果在启动R之前设置OMP_NUM_THREADS参数,或者在R会话中设置它,您的问题是可以解决的。
假设您想为loess函数使用两个线程。在启动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的详细信息。
希望这能有所帮助!
发布于 2019-08-01 04:31:39
因此,McG引导我走上了一条最终让我能够控制内核数量的道路,我将把它作为另一个答案发布。
有几个细节我愚蠢地忽略了,那就是我正在RStudio服务器上工作。对于所有其他目的,我确实认为McG的答案会很好。
这个答案帮助我向谷歌获取了正确的术语,在浏览搜索结果时,我偶然发现了这个thread,它表明RhpcBLASctl软件包具有如下设置内核数量的功能:
blas_set_num_threads(2)在运行loess之前,在RMarkdown文档中设置它,使我的CPU使用率保持在200%,而之后运行loess函数,这在以前是有问题的。
https://stackoverflow.com/questions/57109522
复制相似问题