- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有从 R 调用的 C 代码:
.C("giveProb",as.double(2),as.double(2),as.double(c(0,1,0,1,1,0,1,0)))
我想调用它很多次(数十万次或数百万次)(使用不同的第三个参数),当我将它放入 for 循环中大约 100 次时它工作正常,但超过此次数的任何操作都会崩溃
我感觉这是使用 R_alloc 的内存问题。我在 C 中分配了六个数组,例如:
newCoefArray = (double *)R_alloc(1,curSize * sizeof(double));
但是根据 R 手册“Writing R Extensions”:
This memory is taken from the heap, and released at the end of the .C, .Call or .External call.
我认为这意味着内存将在循环的每次迭代期间被释放。但在下一句中:
Users can also manage it, by noting the current position with a call to vmaxget and clearing memory allocated subsequently by a call to vmaxset. This is only recommended for experts.
作为一个远非专家的人,我希望这里有人能提供帮助。完整的 C 代码如下。
#include <R.h>
#include <Rmath.h>
#include <stdio.h>
void giveProb(double *k, double *q,double *order){
double curSize;
double tmpSize;
double *newCoefArray;
double *oldCoefArray;
double *newAArray;
double *oldAArray;
double *newBArray;
double *oldBArray;
int position=0;
long int factorial(int n){
if(n==0||n==1){
return(1);
}
int tmp=1,i=1;
while(i<=n){
tmp=tmp*i;
i++;
}
return(tmp);
}
void expander(double a, double b,double c,double d,double coeff){
double leadingTerm=beta(a,b);
int bb=b;
double index[bb], sumLeaders[bb];
for(int i=0;i<bb;i++){
index[i]=a+i;
sumLeaders[i]=factorial(a+b-1)/(factorial(index[i])*factorial(a+b-1-index[i]));
newCoefArray[i+position]=coeff*leadingTerm*sumLeaders[i];
newAArray[i+position]=index[i]+c+1;
newBArray[i+position]=a+b+d-index[i];
}
position=position+bb;
curSize=position;
}
void separator(double e, double f){
double a, b, coeff;
for(int i=0; i<tmpSize; i++){
coeff=oldCoefArray[i];
a=oldAArray[i];
b=oldBArray[i];
expander(a,b,e,f,coeff);
}
}
void condenser(){
tmpSize=0;
for(int i=1; i<curSize; i++){
for(int j=0; j<i; j++){
if(newAArray[j]==newAArray[i]){
newCoefArray[j]=newCoefArray[j]+newCoefArray[i];
newCoefArray[i]=0;
}
}
}
for(int i=0; i<curSize; i++){
tmpSize=tmpSize+(newCoefArray[i]!=0);
}
oldCoefArray =(double *) R_alloc(1,tmpSize * sizeof(double));
oldAArray = (double *)R_alloc(1,tmpSize * sizeof(double));
oldBArray = (double *)R_alloc(1,tmpSize * sizeof(double));
for(int i=0; i<tmpSize; i++){
oldCoefArray[i]=newCoefArray[i];
oldAArray[i]=newAArray[i];
oldBArray[i]=newBArray[i];
}
curSize=tmpSize;
}
long double coefficient=1;
for(int i=0;i<*k;i++){
coefficient=coefficient*factorial(*k)/(factorial(i)*factorial(*k-i-1));
}
for(int i=0;i<*q;i++){
coefficient=coefficient*factorial(*q)/(factorial(i)*factorial(*q-i-1));
}
double numObs=*k+*q;
double out=0;
curSize=order[1]+1;
newCoefArray = (double *)R_alloc(1,curSize * sizeof(double));
newAArray = (double *)R_alloc(1,curSize * sizeof(double));
newBArray = (double *)R_alloc(1,curSize * sizeof(double));
expander(order[0]+1,order[1]+1,order[2],order[3],coefficient);
oldCoefArray = (double *)R_alloc(1,curSize * sizeof(double));
oldAArray = (double *)R_alloc(1,curSize * sizeof(double));
oldBArray = (double *)R_alloc(1,curSize * sizeof(double));
for(int i=0;i<curSize; i++){
oldCoefArray[i]=newCoefArray[i];
oldAArray[i]=newAArray[i];
oldBArray[i]=newBArray[i];
}
for(int i=4;i<2*numObs;i+=2){
position=0;
tmpSize=curSize;
separator(order[i],order[i+1]);
condenser();
}
position=0;
for(int i=0;i<curSize;i++){
out=out+newCoefArray[i]*beta(newAArray[i],newBArray[i]);
}
*k=out;
}
更新:使用下面评论中的建议,我得到以下信息(哪一种证实了我之前的想法,对吧?):
R -d valgrind -f test_script.R ==11131== Memcheck,内存错误检测器 ==11131== 版权所有 (C) 2002-2010 和 GNU GPL'd,Julian Seward 等人。 ==11131== 使用 Valgrind-3.6.0 和 LibVEX;使用 -h 重新运行以获得版权信息 ==11131== 命令:/usr/lib64/R/bin/exec/R -f test_script.R ==11131==
R version 2.15.1 (2012-06-22) -- "Roasted Marshmallows"
Copyright (C) 2012 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-redhat-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
==11131== Conditional jump or move depends on uninitialised value(s)
==11131== at 0x3A6A685F80: __GI___strcasecmp_l (in /lib64/libc-2.12.so)
==11131== by 0x3A6A61FF24: __gconv_open (in /lib64/libc-2.12.so)
==11131== by 0x3A6A62D3B7: _nl_find_msg (in /lib64/libc-2.12.so)
==11131== by 0x3A6A62DB83: __dcigettext (in /lib64/libc-2.12.so)
==11131== by 0x3A6C3BD2DF: ??? (in /usr/lib64/R/lib/libR.so)
==11131== by 0x3A6C313FC8: setup_Rmainloop (in /usr/lib64/R/lib/libR.so)
==11131== by 0x3A6C315278: Rf_mainloop (in /usr/lib64/R/lib/libR.so)
==11131== by 0x40084A: main (in /usr/lib64/R/bin/exec/R)
==11131==
==11131== Use of uninitialised value of size 8
==11131== at 0x3A6A6863A4: __GI___strcasecmp_l (in /lib64/libc-2.12.so)
==11131== by 0x3A6A61FF24: __gconv_open (in /lib64/libc-2.12.so)
==11131== by 0x3A6A62D3B7: _nl_find_msg (in /lib64/libc-2.12.so)
==11131== by 0x3A6A62DB83: __dcigettext (in /lib64/libc-2.12.so)
==11131== by 0x3A6C3BD2DF: ??? (in /usr/lib64/R/lib/libR.so)
==11131== by 0x3A6C313FC8: setup_Rmainloop (in /usr/lib64/R/lib/libR.so)
==11131== by 0x3A6C315278: Rf_mainloop (in /usr/lib64/R/lib/libR.so)
==11131== by 0x40084A: main (in /usr/lib64/R/bin/exec/R)
==11131==
==11131== Use of uninitialised value of size 8
==11131== at 0x3A6A6863A8: __GI___strcasecmp_l (in /lib64/libc-2.12.so)
==11131== by 0x3A6A61FF24: __gconv_open (in /lib64/libc-2.12.so)
==11131== by 0x3A6A62D3B7: _nl_find_msg (in /lib64/libc-2.12.so)
==11131== by 0x3A6A62DB83: __dcigettext (in /lib64/libc-2.12.so)
==11131== by 0x3A6C3BD2DF: ??? (in /usr/lib64/R/lib/libR.so)
==11131== by 0x3A6C313FC8: setup_Rmainloop (in /usr/lib64/R/lib/libR.so)
==11131== by 0x3A6C315278: Rf_mainloop (in /usr/lib64/R/lib/libR.so)
==11131== by 0x40084A: main (in /usr/lib64/R/bin/exec/R)
==11131==
Natural language support but running in an English locale
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
[Previously saved workspace restored]
> dyn.load("SchWolfenew.so")
> for(i in 1:1000){
+ .C("giveProb",as.double(2),as.double(2),as.double(c(0,1,0,1,1,0,1,0)))
+ }
==29371== Invalid read of size 1
==29371== at 0x3A6C31A2E9: ??? (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C31CBC9: Rf_cons (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2D2B74: ??? (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2DD121: Rf_eval (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2DF830: Rf_applyClosure (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C32B828: Rf_usemethod (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C32BAE7: ??? (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2D290B: ??? (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2DD121: Rf_eval (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2DF830: Rf_applyClosure (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2DD3F7: Rf_eval (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2DEF4F: ??? (in /usr/lib64/R/lib/libR.so)
==29371== Address 0x3ff0000000000003 is not stack'd, malloc'd or (recently) free'd
==29371==
*** caught segfault ***
address (nil), cause 'unknown'
==29371== Invalid read of size 1
==29371== at 0x3A6C31AF0B: ??? (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C31CBC9: Rf_cons (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C31CC71: Rf_allocList (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2C8CD4: R_GetTraceback (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C313472: ??? (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6B20F4FF: ??? (in /lib64/libpthread-2.12.so)
==29371== by 0x3A6C31A2E8: ??? (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C31CBC9: Rf_cons (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2D2B74: ??? (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2DD121: Rf_eval (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2DF830: Rf_applyClosure (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C32B828: Rf_usemethod (in /usr/lib64/R/lib/libR.so)
==29371== Address 0x4020000000000003 is not stack'd, malloc'd or (recently) free'd
==29371==
==29371==
==29371== Process terminating with default action of signal 11 (SIGSEGV)
==29371== General Protection Fault
==29371== at 0x3A6C31AF0B: ??? (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C31CBC9: Rf_cons (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C31CC71: Rf_allocList (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2C8CD4: R_GetTraceback (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C313472: ??? (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6B20F4FF: ??? (in /lib64/libpthread-2.12.so)
==29371== by 0x3A6C31A2E8: ??? (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C31CBC9: Rf_cons (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2D2B74: ??? (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2DD121: Rf_eval (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C2DF830: Rf_applyClosure (in /usr/lib64/R/lib/libR.so)
==29371== by 0x3A6C32B828: Rf_usemethod (in /usr/lib64/R/lib/libR.so)
==29371==
==29371== HEAP SUMMARY:
==29371== in use at exit: 29,307,724 bytes in 12,896 blocks
==29371== total heap usage: 28,845 allocs, 15,949 frees, 48,495,252 bytes allocated
==29371==
==29371== LEAK SUMMARY:
==29371== definitely lost: 0 bytes in 0 blocks
==29371== indirectly lost: 0 bytes in 0 blocks
==29371== possibly lost: 0 bytes in 0 blocks
==29371== still reachable: 29,307,724 bytes in 12,896 blocks
==29371== suppressed: 0 bytes in 0 blocks
==29371== Rerun with --leak-check=full to see details of leaked memory
==29371==
==29371== For counts of detected and suppressed errors, rerun with: -v
==29371== Use --track-origins=yes to see where uninitialised values come from
==29371== ERROR SUMMARY: 5 errors from 5 contexts (suppressed: 21 from 9)
Segmentation fault (core dumped)
最佳答案
我将你的 C 代码放在文件 memory.c 中,然后运行 R CMD SHLIB memory.c。这是我的测试脚本
dyn.load("/tmp/memory.so")
set.seed(123L)
while (TRUE)
.C("giveProb",as.double(2),as.double(2), sample(c(0, 1), 8, TRUE))
R -d valgrind -f test_script.R 说
> dyn.load("/tmp/memory.so")
> set.seed(123L)
> while (TRUE)
+ .C("giveProb",as.double(2),as.double(2), sample(c(0, 1), 8, TRUE))
==3461== Invalid write of size 8
==3461== at 0xBF29D78: expander.4631 (memory.c:35)
==3461== by 0xBF29EBB: separator.4643 (memory.c:49)
==3461== by 0xBF29AAB: giveProb (memory.c:108)
==3461== by 0x4EEAF49: do_dotCode (dotcode.c:1689)
==3461== by 0x4F1F4E2: Rf_eval (eval.c:493)
==3461== by 0x4F218F6: do_for (eval.c:1310)
==3461== by 0x4F1F2E8: Rf_eval (eval.c:467)
==3461== by 0x4F6B5FB: Rf_ReplIteration (main.c:256)
==3461== by 0x4F6B7B2: R_ReplConsole (main.c:305)
==3461== by 0x4F6D022: run_Rmainloop (main.c:987)
==3461== by 0x4F6D037: Rf_mainloop (main.c:994)
==3461== by 0x400845: main (Rmain.c:32)
(还有更多)。 memory.c 第 35 行是
newCoefArray[i+position]=coeff*leadingTerm*sumLeaders[i];
所以 i + position 大于分配的数组。
关于c - 在 C 中使用 R_alloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12084404/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!