0

我已经按照 rJava 安装中的 rtest.java 示例代码(Debian 和衍生产品上的 /usr/lib/R/site-library/rJava/jri/examples/rtest.java)从 java 数组构建 data.frames。

这适用于小数据帧(约 10000 行),但是当我愤怒地尝试执行此操作(即 > 1000000 行)时,它会导致 java 运行时出现段错误。

奇怪的是,我似乎能够创建 data.frame ok(进行通常的 rniPutXXXArray 调用),但是当我来保存 data.frame (使用 eval,在将 data.frame 分配给 R 符号之后)问题发生。

当我在 R 引擎上调用 eval 时,我可以看到一些调试,但是当我通过低级接口 (rniXXX) 时,我根本没有得到任何调试。有没有办法打开比我已经拥有的更多的调试?

对于它的价值,这里是 segv 消息的顶部。我当然可以根据要求提供更多细节。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f1be6259ea5, pid=6898, tid=139758087001856
#
# JRE version: 7.0_03-b21
# Java VM: OpenJDK 64-Bit Server VM (22.0-b10 mixed mode linux-amd64 compressed oops)
# Derivative: IcedTea7 2.1.3
# Distribution: Debian GNU/Linux unstable (sid), package 7u3-2.1.3-1
# Problematic frame:
# C  [libR.so+0x117ea5]  SET_VECTOR_ELT+0x11f5
...
4

1 回答 1

0

请在 stats-rosuda-devel 上询问,包括您正在使用的实际代码。请注意,使用 RNI 调用,您负责保护对象 - 不幸的是,示例代码跳过了该方面,因此可能发生的情况是,由于对象的大小,垃圾收集发生在您完成构造之前,因此一些对象被收集,因此是无效的,R 会在你身上崩溃。如果您想安全,请保护列,然后保护您从中创建的通用向量。

BTW:使用org.rosuda.REngineAPI 比直接使用 RNI 更安全。它甚至提供REXP.createDataFrame()了为您完成所有工作的方法。

于 2013-01-09T03:58:00.877 回答