已超过R中DLL的最大数量
我使用RStan从大量高斯过程(GPs)中采样,即使用函数stan()。对于我适合的每个GP,都会加载另一个DLL,这可以通过运行R命令看到已超过R中DLL的最大数量,r,rcpp,stan,R,Rcpp,Stan,我使用RStan从大量高斯过程(GPs)中采样,即使用函数stan()。对于我适合的每个GP,都会加载另一个DLL,这可以通过运行R命令看到 getLoadedDLLs() 我遇到的问题是,因为我需要安装这么多独特的GPs,我超过了可以加载的DLL的最大数量,此时我收到以下错误: Error in dyn.load(libLFile) : unable to load shared object '/var/folders/8x/n7pqd49j4ybfhrm999z3cwp81814xh/
getLoadedDLLs()
我遇到的问题是,因为我需要安装这么多独特的GPs,我超过了可以加载的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_DLL从源代码构建R不是一个选项,因为我的代码将由不习惯该过程的合作者运行。我尝试过使用dyn.unload()卸载DLL的天真方法,希望在再次需要DLL时可以重新加载它们。卸载工作正常,但当我再次尝试使用fit时,R不出所料地崩溃,出现如下错误:
*** caught segfault ***
address 0x121366da8, cause 'memory not mapped'
我还尝试过分离RStan,希望DLL能够自动卸载,但即使在卸载包之后,它们也会保持不变(正如预期的那样,考虑到分离帮助中的以下内容:“分离通常不会卸载任何动态加载的编译代码(DLL)”)
从这个问题来看,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)
}
require(rstan)
x我不能谈论关于DLL的问题,但是您不需要每次都编译模型。您可以编译一次模型并重用它,这不会导致此问题,而且会加快代码的速度
函数stan
是编译模型的stan_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)
}
require(rstan)
下面是我用来连续运行几个stan模型的方法(Win10,R3.3.0)
我不仅需要卸载dll文件,还需要删除它们和其他临时文件。然后,我的文件名与本建议的斯坦对象中的文件名不同
dso_filenames <- dir(tempdir(), pattern=.Platform$dynlib.ext)
filenames <- dir(tempdir())
for (i in seq(dso_filenames))
dyn.unload(file.path(tempdir(), dso_filenames[i]))
for (i in seq(filenames))
if (file.exists(file.path(tempdir(), filenames[i])) & nchar(filenames[i]) < 42) # some files w/ long filenames that didn't like to be removeed
file.remove(file.path(tempdir(), filenames[i]))
dso\u文件名我很惊讶每个进程都会加载另一个DLL。我想知道从一开始是否最容易防止这种情况发生。你能提供一个最小但功能齐全的代码示例来解决你的问题吗?这是一个(R)斯坦设计问题和限制。Rcpp只是帮助创建可动态加载的库;对于是否建议加载100个,它没有意见。我怀疑最终你会达到一个操作系统限制(超出你确定的硬编码的R限制)。为了完整起见,如果你确实有一个在R会话中加载100个DLL的正当理由,我认为你可以使用dyn.unload
函数通过dyn.unload(file.path(tempdir(),paste0)(get_stanmodel(stanfit))卸载其中一些DLL@dso@dso_filename,.Platform$dynlib.ext))
,其中stanfit
是由采样
或stan
函数生成的对象。或者您可以用stan\u model
生成的对象替换get\u stanmodel(stanfit)
。但是,您将非常有限,无法在不使R崩溃的情况下使用stanfit
对象(无监视器
,打印
,日志问题
,等等)
dso_filenames <- dir(tempdir(), pattern=.Platform$dynlib.ext)
filenames <- dir(tempdir())
for (i in seq(dso_filenames))
dyn.unload(file.path(tempdir(), dso_filenames[i]))
for (i in seq(filenames))
if (file.exists(file.path(tempdir(), filenames[i])) & nchar(filenames[i]) < 42) # some files w/ long filenames that didn't like to be removeed
file.remove(file.path(tempdir(), filenames[i]))