0

Java 配列から data.frames を構築するために、rJava インストール (Debian および派生物では /usr/lib/R/site-library/rJava/jri/examples/rtest.java) の rtest.java サンプル コードに従いました。

これは小さなデータ フレーム (~ 10000 行) ではうまく機能しますが、怒ってこれを実行しようとすると (つまり > 1000000 行)、Java ランタイムで segfault が発生します。

奇妙なことに、data.frame を正常に作成できるように見えますが (通常の rniPutXXXArray 呼び出しを行う)、data.frame を保存するとき (data.frame を R シンボルに割り当てた後、eval を使用) に問題が発生します。発生します。

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 がクラッシュします。安全を確保したい場合は、列を保護してから、そこから作成した汎用ベクトルを保護してください。

ところで: org.rosuda.REngineRNI を直接使用するよりも、API を使用する方がはるかに安全です。それはあなたのためにすべての仕事をする方法さえ提供REXP.createDataFrame()します。

于 2013-01-09T03:58:00.877 に答える