1
次最小限の例では、私は私の例に漏れの原因を理解していないメモリリーク(0.17.0 verison scipyのダウンロードを使用してテスト)rv_continuousでランダム変数を生成するときにscipy.statsでメモリリークを修正する方法は?
import resource
from scipy.stats import rv_continuous
class Rv(rv_continuous):
def __init__(self, x):
rv_continuous.__init__(self, a=0, b=1)
self.x = x
def _pdf(self, y):
return 1
def call_rv(x):
rv = Rv(x)
# if the line below is commented out, memory usage stays constant
s = rv.rvs()
return 1
for k in range(10000):
x = call_rv(k)
if k%1000==0:
mem = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
print 'Memory usage: %s (kb)' % mem
に苦しむように見えます。特に、ランダム変数生成s = rv.rvs()
がコメントアウトされている場合、リークは発生しません。
rv_continuous
と乱数生成を使用すると、メモリリークを回避するにはどうすればよいですか?
メモリリークではない理由をもっと説明できますか?このプロセスは、時間とともにますます多くのメモリを消費します。また、後でrv.rvs()を呼び出さない限り、あなたが参照するコード行はうまく見えます。いずれにしてもありがとうございます。あなたのコメントは私のコードの構造を再考するようになりました。ループ内に新しいインスタンスを作成する必要がないソリューションを考え出すことができました。 –
ループ内でガベージコレクションを呼び出して、ガベージコレクションが遅れているかどうかを確認できます。 – user333700
OSのシステムモニタで確認してください。メモリリークは、Pythonプロセスを終了してもメモリ消費が低下しないことを意味します。 –