Rpy2でブリッジされたPythonとRでデータ処理プログラムを書いています。
入力データはバイナリで、Python を使用してデータを読み取り、R に渡し、結果を収集して出力します。
データは、それぞれ約 100 バイト (値ごとに 1 バイト * 100 値) の断片に編成されます。
それらは現在機能していますが、速度は非常に遅いです。1GB サイズ (つまり、10^7 ピース) のデータに対する私のテストの一部を次に示します。
Rpy2 呼び出しを無効にして予行演習を行うと、1 つのスレッドを使用して Intel(R) Xeon(TM) CPU 3.06GHz で Python がすべてループするのに約 90 分かかります。
その Xeon デュアル コアですべての機能とマルチスレッドを有効にすると、プログラムが完了するまでに (概算で) 200 時間ほどかかります。
Python プログラムを数回強制終了しました。コール スタックはほとんど常に Rpy2 関数インターフェイスを指しています。プロファイリングも行いましたが、同様の結果が得られました。
これらすべての観察結果は、Rpy2 によって呼び出される R 部分がボトルネックであることを示しています。そのため、R プログラムのスタンドアロン バージョンをプロファイリングしましたが、プロファイリングの概要は「匿名」を指しています。私はまだ、R スクリプトのどの部分が最も時間のかかる部分であるかを確認する方法を推し進めています。****更新、以下の私の編集を参照してください*****
疑わしい候補が 2 つあります。1 つは、cran[1] の wmtsa を使用した連続ウェーブレット変換 (CWT) とウェーブレット変換モジュラス マキシマ (WTMM) であり、もう 1 つは、ex-Gaussion 曲線の非線形フィッティングです。
私の頭に浮かぶのは次のとおりです。
フィッティングのために、R ルーティングをインライン C コードに置き換えることができますか? Cおよびfortranで利用可能な多くのフィッティングライブラリがあります...(ネットからのアイデア;私はそれをしたことがありません;不明です)
ウェーブレット アルゴリズムの場合.... C でホットスポットを書き直すには、wmtsa パッケージを分析する必要がありますか? .... C または fortran を使用して wmtsa パッケージ全体を再実装することは、私にとって非常に簡単なことではありません。私はプログラミングの経験があまりありません。
ファイル内のデータは 20 個の連続したバイトで構成されています。これを C のような char* 配列に直接マップできますか? 現在、私のPythonプログラムは一度に1バイトを読み取ってリストに追加するだけで、遅いです。コードのこの部分には 1.5 時間かかるのに対し、R では約 200 時間かかるため、それほど緊急ではありません。
実際の問題を解決する際にプログラムの効率性に出会ったのはこれが初めてです。私はSTFWで、情報に圧倒されました。これからどうすればいいのか、アドバイスをお願いします。
乾杯!
脚注:
* アップデート *
cran の proftools のおかげで、コール スタック グラフを作成することができました。そして、約 56% の時間が wmtsa に費やされていることがわかりました。コード スニペットは次のようになります。
W <- wavCWT(s,wavelet="gaussian1",variance=1/p) # 1/4
W.tree <-wavCWTTree(W) # 1/2
holderSpectrum(W.tree) # 1/4
~28% の時間は nls に費やされます:
nls(y ~ Q * dexGAUS(x, m, abs(s), abs(n)) + B, start = list(Q = 1000, m = h$time[i], s = 3, n = 8, B = 0), algorithm="default", trace=FALSE)
ここでは、gamlss.dist パッケージからの dexGAUS の評価に多くの時間がかかります。
残りの R 時間の約 10% は、データの受け渡し/分割/集約/サブセットに費やされます。