4

ループを実行する Python スクリプトがあります。このループ内で、関数DoDebugInfoはループの反復ごとに 1 回呼び出されます。この関数は基本的に、matplotlib を使用してハード ディスクにいくつかの画像を出力し、KML ファイルをエクスポートし、その他の計算を行い、何も返しません

Pythonが実行するたびに、関数DoDebugInfoがますます多くのRAMを消費するという問題があります。いくつかの変数が各ループのサイズを増やしていると思います。

呼び出しの前後に次の行を追加しました。

print '=== before: ' + str(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1000)
DoDebugInfo(inputs)
print '=== after: ' + str(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1000)

出力は次のとおりです。

=== before: 71598.08
=== after: 170237.952
=== before: 170237.952
=== after: 255696.896
=== before: 255696.896
=== after: 341409.792

ご覧のとおり、呼び出しの前にプログラムにメモリ フットプリントがあり、呼び出しの後に増加しますが、次の呼び出しの前まで安定したままです。

どうしてこれなの?DoDebugInfo(inputs)は何も返さない関数なので、一部の変数がメモリに残るのはどうしてでしょうか? 関数の最後にすべての変数をクリアする必要はありますか?

編集:DoDebugInfoこの機能をインポートします:

def plot_line(x,y,kind,lab_x,lab_y,filename):
    fig = plt.figure(figsize=(11,6),dpi=300)
    ax = fig.add_subplot(111)
    ax.grid(True,which='both')
    #print 'plotting'
    if type(x[0]) is datetime.datetime:
        #print 'datetime detected'
        ax.plot_date(matplotlib.dates.date2num(x),y,kind)
        ax.fmt_xdata = DateFormatter('%H')
        ax.autoscale_view()
        fig.autofmt_xdate()
    else:   
        #print 'no datetime'
        ax.plot(x,y,kind)
    xlabel = ax.set_xlabel(lab_x)
    ax.set_ylabel(lab_y)
    fig.savefig(filename,bbox_extra_artists=[xlabel], bbox_inches='tight')

def plot_hist(x,Nbins,lab_x,lab_y,filename):
    fig = plt.figure(figsize=(11,6),dpi=300)
    ax = fig.add_subplot(111)
    ax.grid(True,which='both')
    ax.hist(x,Nbins)
    xlabel = ax.set_xlabel(lab_x)
    ax.set_ylabel(lab_y)
    fig.savefig(filename,bbox_extra_artists=[xlabel], bbox_inches='tight')

次のようなものを使用して、10 個の図をディスクにプロットします。

plot_line(index,alt,'-','Drive Index','Altitude in m',output_dir + 'name.png')

問題を使用する行にコメントしてplot_lineも発生しないため、リークはこのコード行にあるはずです。

ありがとう

4

2 に答える 2

6

この問題は、非常に多くの図が作成され、決して閉じられないことに依存しています。どういうわけか、Pythonはそれらすべてを生かし続けます。

行を追加しました

plt.close()

私のプロット関数のそれぞれに、plot_lineそしてplot_hist問題はなくなりました。

于 2013-04-18T13:12:07.613 に答える