提问人:Chris Stevens 提问时间:5/16/2013 最后编辑:Chris Stevens 更新时间:7/3/2013 访问量:298
调用 R 函数。C() 不断使用静态向量,是否需要不断强制数据类型?
Calling the R function .C() continually with static vectors, do you need to keep coercing datatypes?
问:
我已经在谷歌上搜索了这个问题并查看了 R 扩展手册,但找不到任何有关它的信息。
我有一个相当大的程序,它使用 .C 对 C 代码进行多次调用。我传入了相当多的数据,这些数据在程序过程中不会改变。因此,我决定将它们强制使用正确的数据类型一次:
vec = as.integer(as.vector(vec))。
然后在 .C 调用我写道:
.C('函数', vec = vec)
而不是
.C('函数', vec = as.integer(as.vector(vec))).
这是在分析所显示的那样完成的,因为*占用了一点时间。但是,在这样做时,我(经过几十万次迭代)在 malloc 中出现 glibc 错误:
* 检测到 glibc /usr/lib/R/bin/exec/R:malloc():内存损坏:0x0cabc0d8 **
我只是好奇为什么会发生这种情况,因为我在开始时强制的对象在程序过程中不会改变,以及是否有办法解决这个问题,以便我可以最大限度地减少我的 as.* 调用。
谢谢
克里斯
答:
0赞
Karl Forner
7/3/2013
#1
你很可能只是在你的 C 函数中有一个错误,或者你试图释放你作为参数得到的整数向量,你不应该这样做。 无论如何,这一定与您预转换矢量这一事实无关。
你如何为你的函数提供向量的长度?
评论
0赞
Chris Stevens
7/4/2013
我的 C 代码中不会有错误,就像我调用它时一样。C('fn',i=as.integer(i)...) 它运行得很好,但是当我这样做时.C('fn', i=i) 预定义 i=as.integer(i) 它给出了该错误。我不会释放我自己在 C 中不 malloc 的任何东西。向量/矩阵的长度是预定义的,我将它们作为上面的示例传入。干杯。
0赞
Karl Forner
7/4/2013
嗨,首先,根据我的经验,问题通常出在我们的代码中,所以说错误不能出现在我的 C 代码中可能不是解决问题的正确心态。当然,如果您可以重现该问题并使用最少的 C 函数,那将会有所帮助。问题:1)vec论证的目的是什么?它是一种临时缓冲?2) 需要明确的是:使用 vec = as.integer(as.vector(vec)) 进行相同次数的迭代不会崩溃?3)您是否查看了核心转储,或者在调试器下运行以查看内存故障发生的位置?还是使用valgrind?
0赞
Karl Forner
7/4/2013
4) 您能否尝试将 DUP=TRUE 参数添加到 .C看是否仍然崩溃?
0赞
Chris Stevens
7/5/2013
我没有运行 Valgrind,因为获得此错误所需的时间从 10,000 次迭代到 300,000 次不等。这些需要一些时间(因此我用 C 语言编写),并且使用 valgrind 会大大减慢它的速度。但是,如果没有其他方法可以指出问题,我可以继续工作数周等。我正在共同开发的这个代码库相当大(2009 年的论文将基因型不确定性纳入标记再捕获型模型,以使用 DNA 样本估计丰度),因此我传入的向量/矩阵通常是整数或双精度。我将尝试DUP=TRUE,看看这是否会影响它。谢谢
0赞
Chris Stevens
7/6/2013
1:只有整数和双精度以及它们的向量/矩阵/列表,目的各不相同。2:在发生错误之前,范围为 10,000 到 300,000 次迭代。3:我没有运行valgrind,因为它会减慢速度,以至于在遇到错误之前需要很长时间。我将研究如何运行 DDD。感谢您一直以来的帮助。
评论