2

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 曲線の非線形フィッティングです。

私の頭に浮かぶのは次のとおりです。

  1. フィッティングのために、R ルーティングをインライン C コードに置き換えることができますか? Cおよびfortranで利用可能な多くのフィッティングライブラリがあります...(ネットからのアイデア;私はそれをしたことがありません;不明です)

  2. ウェーブレット アルゴリズムの場合.... C でホットスポットを書き直すには、wmtsa パッケージを分析する必要がありますか? .... C または fortran を使用して wmtsa パッケージ全体を再実装することは、私にとって非常に簡単なことではありません。私はプログラミングの経験があまりありません。

  3. ファイル内のデータは 20 個の連続したバイトで構成されています。これを C のような char* 配列に直接マップできますか? 現在、私のPythonプログラムは一度に1バイトを読み取ってリストに追加するだけで、遅いです。コードのこの部分には 1.5 時間かかるのに対し、R では約 200 時間かかるため、それほど緊急ではありません。

実際の問題を解決する際にプログラムの効率性に出会ったのはこれが初めてです。私はSTFWで、情報に圧倒されました。これからどうすればいいのか、アドバイスをお願いします。

乾杯!

脚注:

  1. http://cran.r-project.org/web/packages/wmtsa/index.html

* アップデート *

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% は、データの受け渡し/分割/集約/サブセットに費やされます。

4

2 に答える 2

1

私の理解は、あなたが持っているということです:

  • 場所で rpy2 を使用する python コード

  • rpy2 の呼び出しに起因するパフォーマンスの問題

  • パフォーマンスの問題は現在、rpy2 自体とはあまり関係がないようです。これは、基盤となる R が実行時間の大部分を担っているためです。

  • R コードの一部は一度に 1 バイトずつ読み取ってリストに追加していましたが、その部分を Python に移動することで改善されました

実際のコードを見ずに助けようとするのは難しいので、次のことを検討してください。

  • バイトを読み取るためのバッファリング戦略(これはジョンによってすでに回答されているため)。

  • R コードの最適化に取り組む

  • 単純な並列化を検討する (そして最終的にはクラウド上の計算スペースを借りる)

于 2010-07-14T05:25:45.210 に答える
1

オプション3..データを効率的に取得するには...ファイルからの1回の読み取りで、Pythonの1つの長いstr型としてすべてを読み取ります。それが myStr と呼ばれているとしましょう。

import array
myNums = array.array('B', myStr)

myNums は、簡単に変換できる各バイトの配列です... help(array.array) を参照してください... 実際、配列を介してファイルから直接取得できるように見えます。

これにより、データの読み取りに 1.4 時間を費やす必要がなくなります。

于 2010-07-14T03:54:30.390 に答える