6

rpy で作成されたオブジェクト (およびそれらが占めるメモリ) をクリアするにはどうすればよいですか?

import rpy2.robjects as r
a = r.r('a = matrix(NA, 2000000, 50)')
del a    #if I do this, there is no change in the amount of memory used
r.r('rm(list=(ls(all=TRUE)))') # Same here, the objects disappear, but the memory is still used

不幸な影響は、私のアプリケーションでは、十分なメモリがなくなるまでメモリ使用量が増加し、その後クラッシュすることです... rpy2 docsから:

オブジェクト自体は利用可能なままであり、Python から foo が削除されるまで R のガベージ コレクションから保護されます。

しかし、やっている:

import rpy2.robjects as r
a = r.r('a = matrix(NA, 2000000, 50)')
r.r.rm('a')
del a
r.r.gc()

使用されているメモリを解放しません...

編集:rpy2 2.0、Win XP、R 2.12.0

4

1 に答える 1

6

大きなオブジェクトを削除または上書きするときは、Python ガベージ コレクターを頻繁に実行する必要があるかもしれないことを示唆するrpy ドキュメントの段落があります。

R オブジェクトは R メモリ空間に存在し、それらのサイズは Python には認識されません。そのため、大きなオブジェクトが関係する場合、Python は常に十分な頻度でガベージ コレクションを行うとは限らないようです。これにより、大きなオブジェクトがループで上書きされると、メモリ使用量が一時的に増加することがあります。システムのメモリ制限に達するとガベージ コレクションがトリガーされるように見えますが、明示的にコレクションをトリガーすることをお勧めします。

gc.collect()マトリックスを作成した直後に実行し、それを削除してRの内部gc()関数を実行した直後に、rpy2にその大きなマトリックスを強制的に解放させることができました。スリープを使用してループで実行します --topメモリ使用量の増減を監視するために使用します。

R バージョン 2.10.1 にリンクされた python-rpy バージョン 2.0.8 を使用して、Ubuntu 10.0.4 上の Python 2.6 で実行されます。これがあなたの進歩に役立つことを願っています:

import gc
import time

import rpy2.robjects as R

for i in range(5):
    print 'pass %d' % i
    R.r('a = matrix(NA, 1000000, 50)')
    gc.collect()
    R.r('rm(a)')
    R.r('gc()')
    gc.collect()

    print 'sleeping..'
    time.sleep(5)
于 2011-03-05T05:16:31.517 に答える