gpt4 book ai didi

r - 超过了 R 中 DLL 的最大数量

转载 作者:行者123 更新时间:2023-12-04 02:15:07 27 4
gpt4 key购买 nike

我正在使用 RStan 从大量高斯过程 (GP) 中进行采样,即使用函数 stan()。对于我适合的每个 GP,都会加载另一个 DLL,如运行 R 命令所示

getLoadedDLLs()

我遇到的问题是,因为我需要安装这么多独特的 GP,我超过了可以加载的最大 DLL 数量,此时我收到以下错误:
Error in dyn.load(libLFile) : 
unable to load shared object '/var/folders/8x/n7pqd49j4ybfhrm999z3cwp81814xh/T//RtmpmXCRCy/file80d1219ef10d.so':
maximal number of DLLs reached...

据我所知,这是在基本 R 代码的 Rdynload.c 中设置的,如下所示:
#define MAX_NUM_DLLS 100

所以,我的问题是,可以做些什么来解决这个问题?使用更大的 MAX_NUM_DLLS 从源代码构建 R 不是一种选择,因为我的代码将由不熟悉该过程的合作者运行。我尝试了使用 dyn.unload() 卸载 DLL 的天真方法,希望它们在再次需要时重新加载。卸载工作正常,但是当我再次尝试使用 fit 时,R 毫不奇怪地崩溃并出现如下错误:
*** caught segfault ***
address 0x121366da8, cause 'memory not mapped'

我还尝试分离 RStan,希望 DLL 会自动卸载,但即使在卸载包后它们仍然存在(正如预期的那样,在 detach 的帮助中给出以下内容:“分离通常不会卸载任何动态加载的编译代码(DLL)”)。

从这个问题, Can Rcpp package DLLs be unloaded without restarting R? ,看来 library.dynam.unload()可能在解决方案中发挥了一些作用,但我没有成功使用它来卸载 DLL,我怀疑在卸载 DLL 后我会遇到与以前相同的段错误。

编辑:添加一个最小的、功能齐全的例子:

R代码:
require(rstan)

x <- c(1,2)
N <- length(x)

fits <- list()
for(i in 1:100)
{
fits[i] <- stan(file="gp-sim.stan", data=list(x=x,N=N), iter=1, chains=1)
}

此代码要求以下模型定义位于文件 gp-sim.stan 中的工作目录中(此模型是 Stan 中包含的示例之一):
// Sample from Gaussian process
// Fixed covar function: eta_sq=1, rho_sq=1, sigma_sq=0.1

data {
int<lower=1> N;
real x[N];
}
transformed data {
vector[N] mu;
cov_matrix[N] Sigma;
for (i in 1:N)
mu[i] <- 0;
for (i in 1:N)
for (j in 1:N)
Sigma[i,j] <- exp(-pow(x[i] - x[j],2)) + if_else(i==j, 0.1, 0.0);
}
parameters {
vector[N] y;
}
model {
y ~ multi_normal(mu,Sigma);
}

注意:此代码需要相当长的时间才能运行,因为它正在创建大约 100 个 Stan 模型。

最佳答案

我不能谈论有关 dll 的问题,但是您不需要每次都编译模型。您可以编译一次模型并重复使用它,这不会导致此问题,并且会加快您的代码速度。

函数stanstan_model 的包装器编译模型和 sampling从模型中抽取样本的方法。你应该运行 stan_model一次编译模型并将其保存到一个对象中,然后使用 sampling该对象上的方法来绘制样本。

require(rstan)

x <- c(1,2)
N <- length(x)

fits <- list()
mod <- stan_model("gp-sim.stan")
for(i in 1:100)
{
fits[i] <- sampling(mod, data=list(x=x,N=N), iter=1, chains=1)
}

这类似于运行平行链的问题,在 Rstan wiki 中讨论过。 .您的代码可以通过用并行处理采样的东西替换 for 循环来加速。

关于r - 超过了 R 中 DLL 的最大数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24832030/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com