2016-12-10 15 views
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と乱数生成を使用すると、メモリリークを回避するにはどうすればよいですか?

答えて

1

これはメモリリークではなく、メモリは最終的にOSに返されます。

rv = Rv(x) 

は、ループ内に新しいインスタンスを作成します。それをしないで、あなたのメモリ消費量をチェックします。 N個の変量を生成する場合は、一度インスタンスを作成してから.rvs(size=N)を実行します。

+1

メモリリークではない理由をもっと説明できますか?このプロセスは、時間とともにますます多くのメモリを消費します。また、後でrv.rvs()を呼び出さない限り、あなたが参照するコード行はうまく見えます。いずれにしてもありがとうございます。あなたのコメントは私のコードの構造を再考するようになりました。ループ内に新しいインスタンスを作成する必要がないソリューションを考え出すことができました。 –

+0

ループ内でガベージコレクションを呼び出して、ガベージコレクションが遅れているかどうかを確認できます。 – user333700

+1

OSのシステムモニタで確認してください。メモリリークは、Pythonプロセスを終了してもメモリ消費が低下しないことを意味します。 –

関連する問題