0

これは、マルチスレッドから rpy2 を使用して r 関数を呼び出す場合の効率の問題です。

r 関数のタスクは、基本的にモデル ファイルをディスクから読み込み、そのモデルを使用して時系列を分類します。ただし、入力時系列の収集は、Python を使用してデータベースからポーリングすることによって行われます (一部の Web サービスによって更新されます)。Python コードが新しい時系列を検出すると、rpy2 を使用して r 関数を呼び出して分類タスクを実行するワーカー プロセスが作成されます。

Python に分類タスクを実行させることは、私たちにとってオプションではありません。私の主な懸念は、モデル ファイルをロードするときのオーバーヘッドです。明らかに、新しい時系列が分類されるたびにファイルが一度読み取られることは望ましくありません。だから質問は -

モデル ファイルを 1 回だけ読み込むにはどうすればよいですか? 同じ r 関数が rpy2 を介して呼び出されたときに、メモリ内のモデル オブジェクトを再利用できますか?

私の最初の意図は、モデル ファイルを python にロードし、r 関数が呼び出されるたびにパラメーターとして渡すことです。ただし、これにより、モデル パラメーターをコピーするための余分なコストが発生します (サイズが無視できないとします)。

あなたの助けは非常に高く評価されます!

4

1 に答える 1

1

私が正しく理解している場合、あなたは:

  1. R で記述された関数 (分類子) があり、機能するために比較的大量のデータ本体が必要です (k 最近隣人?)
  2. Pythonを使用してそのデータ本体をロードしています
  3. パラメータを /once/ ロードした後、必要なだけ分類子を呼び出します
  4. 分類子のパラメータとしてデータ本体を渡す計画

4. に従う場合、コピーは必ずしも必要ではありませんが、現時点では、データが数値またはブール値であり、メモリ領域が R によって割り当てられている場合のみです。

ただし、その状況のより簡単な代替手段は、データの本体を一度だけ R に渡し (必要に応じてコピーし)、その変換されたオブジェクトを使用することだと思います。

from rpy2.robjects.packages import importr
e1071 = importr('e1071')

from rpy2.robjects.conversion import py2ri

# your model's data are in 'm_data'
# here conversion is happening
r_m_data = py2ri(m_data)

for test_data in many_test_data:
    # r_m_data is already a pointer to an R data structure
    # (it was converted above - no further copying is made)
    res = e1071.knn(r_m_data, test_data)

これは、次のように説明するものに対応します。

モデル ファイルを 1 回だけ読み込むにはどうすればよいですか? 同じ r 関数が rpy2 を介して呼び出されたときに、メモリ内のモデル オブジェクトを再利用できますか?

于 2013-03-29T12:45:39.347 に答える