R/rpy2 の as.dist 関数に関するメモリの問題
質問
カスタム距離測定を使用して階層クラスタリングを実行しようとしています。すべての計算を Python で実行し、データ構造を R に渡してクラスタリングを実行します。
import rpy2.robjects as robjects
r=robjects.r
from rpy2.robjects.packages import importr
stats = importr('stats')
m = r.matrix(robjects.FloatVector(list_of_data), ncol=size, byrow=True)
dist_mat=stats.as_dist(m)
hc=stats.hclust(new_dist_mat)
したがって、私の距離の測定値は Python リストに保持され、R 行列に変換され、さらに R 行列に変換されます。 dist
クラスタリングに必要なオブジェクト。これはある程度は機能します。ただし、行列が大きくなりすぎると、次のエラーが発生します。
python(18944,0xb0081000) malloc: *** mmap(size=168898560) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Error: cannot allocate vector of size 161.1 Mb
これは、に変換する時点で発生します。 dist
物体 (as.dist
)。どのくらいのサイズで破綻するかはテストしていませんが、3000x3000のマトリックスでは動作しますが、6500x6500のマトリックスでは失敗するので、その中間のサイズになります。私が使っているのは、 del
Python の関数を使用してメモリから不要なオブジェクトを削除しようとしますが、私が読んだ限りでは、これはメモリがすぐに使用できるようになるという保証はありません。
結局のところ、メモリをより効率的に取得する方法はあるのでしょうか? dist
物体?それとも、別の方法を使用できるのでしょうか?Rの他の方法をいくつか見つけました cluster
を使用しないライブラリ dist
オブジェクトを使用しますが、これらのメソッドは組み込みの距離メトリックを使用します。
前もって感謝します!
解決
Python の del() を呼び出しても、メモリがすぐに使用できるようになるという保証はありません。ガベージ コレクターを明示的に呼び出すと役立ちます。他の質問に対する答えはここにあります(rpy2が使用するメモリをクリアする) は、rpy2 ドキュメントの関連セクションを指します。
クラスタリング アルゴリズムに関しては、 hclust() を使用した階層的クラスタリングには「距離」行列 (サイズ n * (n + 1) / 2 が必要です。行列は対称であるため、R はメモリを少し節約します)。他のクラスタリング アルゴリズムが存在する場合や、初期ブロックを作成して開始行列のサイズを最小化する階層的クラスタリング トリックに興味がある場合は、それはプログラミング関連の質問の範囲外です。