1

Java から R に大きなデータセットをロードする際に問題があります。問題は、実際に私が使用している関数にあります: re.eval(). ファイルをRにロードしてRで分析/操作できるようにしたいのですが、これをJavaから行いたいです(これはGUIを構築するためです)。

関数に実行させたいのは、提供した文字列を解析して評価することですが、 eval 関数は結果を解析、評価して返します。ヒープ サイズに関して Java からメモリ不足エラーが発生します。これは私が現時点で持っているコードです:

JButton getFile = new JButton("Load");
        getFile.setBounds(316, 10, 151, 23);
        getFile.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent e) 
            {
                    REXP x;
                    getFileName();
                if (dataFilePath != null){
                String file = dataFilePath.replace("\\", "\\\\\\\\");
                re.eval("data<-read.csv(file='"+file+"', head=TRUE, sep='|')");


                x = re.eval("names(data)");

                String[] column_names = x.asStringArray();
                originalDataLength = column_names.length;

                for (int i = 0; i < column_names.length; i++) {
                        comboBox.insertItemAt(column_names[i], 0);  
                    }

                textField.setText("Data Loaded");
                }

        }
    }
);

このコードは、13500x220 のデータフレームで作業していたときに機能しました。新しいデータフレームは 50000x700 です。上記のコードで正確に何が起こっているのかも疑問に思っていましたか? R で作成され、Java に送り返されます (つまり、複製されますか?)。

ヘルプ/コメントをいただければ幸いです。また、Rosuda Rengine クラスの説明と利用可能な機能も調べました。問題を解決できるかもしれないと思っていrniEval()ましたが、実装方法がわかりません。

4

1 に答える 1

0

actionPerformed はイベント スタックで呼び出されるため、イベント処理を短くする必要があります。それも役立つかもしれません。電話:

SwingUtilities.invokeLater(new Runnable() {
    public void run() { ... your code ... }
}

さらに、列名のみが必要な場合は、R で両方の eval 式を組み合わせる必要があります。たぶん最初の行を読むだけです(java?)。

于 2011-11-07T13:04:40.907 に答える