私のコードには、これに似た小さな部分があります(もちろん、ゼロで埋められたものの代わりに実際の行列を使用しています):
x = [rinterface.FloatSexpVector([0]*(1000**2)) for i in xrange(20)]
y = robjects.r('list')(x)
メモリリークを引き起こしているようです。
次のコードを実行する場合:
for i in xrange(10):
x = [rinterface.FloatSexpVector([0]*(1000**2)) for i in xrange(20)]
y = robjects.r('list')(x)
del x
del y
robjects.r('gc(verbose=TRUE)')
私は得る:
Error: cannot allocate vector of size 7.6 Mb
In addition: Warning messages:
1: Reached total allocation of 2047Mb: see help(memory.size)
2: Reached total allocation of 2047Mb: see help(memory.size)
3: Reached total allocation of 2047Mb: see help(memory.size)
4: Reached total allocation of 2047Mb: see help(memory.size)
これはバグですか、それとも他にすべきことがありますか? また、変数を robjects.globalenv に入れてから、gc() の前に rm()-ing することで、名前付きの変数を作成しようとしましたが、うまくいかないようです。
Windowsでrpy 2.3devを実行していることに言及する必要がありますが、これはrpy 2.2.6を使用するLinuxでも発生します(ただし、LinuxはWindowsマシンのように32ビットではなく64ビットバージョンを実行するため、メモリが増えるだけで、私はしません2047mb エラーを取得します)
編集: R gc() が最初のコード例の問題を解決する前に gc.collect() を追加するようですが、これは私の問題を解決しませんでした-コードを深く掘り下げると、問題の原因となる行が代入にあることがわかりました次のように、値を .names に追加します。
x = [rinterface.FloatSexpVector([0]*(1000**2)) for i in xrange(20)]
y = robjects.r('list')(x)[0]
y.names = rinterface.StrSexpVector(['a']*len(y))
クリーニングの前にrinterface.NULLを置いても役に立ちません。助言がありますか?