簡體   English   中英

重復調用C函數會導致R崩潰-如何分配內存?

[英]Repeated call to C function crashes R - how to allocate memory?

如果我反復從R調用C函數,則會遇到R崩潰的情況。

我是編寫C函數的新手,我認為我遇到的R崩潰問題是C中的內存分配。我知道一個人可以釋放C中的內存,但是我無法弄清楚究竟是什么以及在哪些參數上。 有人可以幫我嗎?

我將在此處發布一個工作示例,並在最后再次發布我的問題。

這是C代碼(信譽:該代碼基於Marteen Speeklenbrink( https://github.com/rforge/mcplr )的mcplr軟件包的代碼。

#include <Rmath.h>

void gcmval(int *y, int *ny, double *x, int *nx, double *v, double *p, int *bt, int *et, double *w, double *r, double *q, double *lambda, double *theta, double *dist, double *sim, double *val, double *vpred, double *ypred)
{
  double syp = 0.0;
  double svp = 0.0;

  for(int t=*bt; t < *et; t++) {
    for(int j=0; j < *ny; j++) sim[j] = 0.0;
    svp = 0.0;
    for(int tt=*bt-1; tt < t; tt++) {
      dist[tt] = 0.0;
      for(int i=0; i < *nx; i++) {
        dist[tt] += w[i] * pow( fabs(x[i + tt * *nx] - x[i + t * *nx ]),    *r);
        }
      dist[tt] = pow(dist[tt], *q / *r);
      val[tt] = exp(-1 * *lambda *dist[tt]) * v[tt];
      for(int j=0; j < *ny; j++) {
        if(y[j + tt * *ny] == 1) sim[j] += exp(-1 * *lambda * dist[tt]);
      }
      svp += val[tt];           
      }
    syp = 0.0;
    for(int j=0; j < *ny; j++) {
        syp   += sim[j];
      }
    vpred[t] = svp / syp;
    ypred[t] = 1.0 / (1.0 + exp(-1 * *theta * (vpred[t] - p[t])));
  }
}

R代碼這是一個使用我們在R中的C語言中定義的函數的有效示例。如果我反復調用.C,R將崩潰(在Windows 10上)。 我需要反復調用它,我不確定如何進行記憶分配。

if(.Platform$OS.type == "windows"){
    dyn.load("gcmval.dll")
} else if(.Platform$OS.type %in% c("mac","unix")){
    dyn.load("gcmval.so")
}

# Some fake input data
dt <- data.table(f1      = c(1,1,0,0,1,0),
                 f2      = c(1,1,0,0,1,0),
                 f3      = c(1,1,0,0,0,1),
                 choices = c(0,0,1,1,0,1),
                 prices  = c(1,1,3,3,2,2),
                 values  = c(.9,.9,3.1,3.1,1.5,2.5))

# Next lines just prepare the variables for the C-function   
   y <- rbind(t(dt$choices), 1-t(dt$choices))
   x <- t(dt[,1:3])
   w <- rep(1/3,3)
   v <- dt$values
   p <- dt$prices
   nx       <- nrow(x)
   ny       <- nrow(y)
   nt       <- ncol(x)
   bt       <- 1
   et       <- nt
   lambda   <- 1
   theta    <- 1
   r        <- 1
   q        <- 1
   pv   <- vector("double", length = nt)
   py   <- vector("double", length = nt)
   val  <- vector("double",length=nt)
   dist <- vector("double",length=nt)
   sim  <- vector("double",length=ny)
   val  <- vector("double",length=ny)

# Run this code repeatedly, it crashes R
   tmp <- .C("gcmval",
         y=as.integer(y), 
         ny=as.integer(ny), 
         x=as.double(x), 
         nx=as.integer(nx),
         v=as.double(v),
         p=as.double(p), 
         bt=as.integer(bt),
         et=as.integer(et), 
         w=as.double(w), 
         r=as.double(r), 
         q=as.double(q), 
         lambda=as.double(lambda), 
         theta=as.double(theta), 
         dist=as.double(dist), 
         sim=as.double(sim),
         val=as.double(val),
         vpred=as.double(pv), 
         ypred=as.double(py)
      )

我認為R_alloc是我的朋友,但是我在應用它時遇到了麻煩。

如果有人可以幫助我全面介紹/解釋如何准確使用R_alloc函數(在編寫r擴展教程中有一些神秘的例子,但我無法解析它們),或者對如何使用它的任何一般解釋,我將非常高興內存分配有效(對於一個非常了解R但又是一個自學成才的程序員的人)。

預先感謝您的幫助/ Jana

問題是您兩次定義了向量val

val  <- vector("double",length=nt)
dist <- vector("double",length=nt)
sim  <- vector("double",length=ny)
val  <- vector("double",length=ny)

在第二個定義中,長度不正確,因為val必須與dist而不是sim 如果刪除第二個定義,崩潰將消失。

我發現有趣的是,崩潰僅在重復調用之后才觸發。 我可以通過調用tmpgc()立即觸發它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM