Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
已超过R中DLL的最大数量_R_Rcpp_Stan - Fatal编程技术网

已超过R中DLL的最大数量

已超过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/

我使用RStan从大量高斯过程(GPs)中采样,即使用函数stan()。对于我适合的每个GP,都会加载另一个DLL,这可以通过运行R命令看到

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]))