나는 루프를 돌리는 파이썬 스크립트를 가지고있다. 이 루프 내에서 함수 DoDebugInfo
이 루프 반복마다 한 번 호출됩니다. 이 함수는 기본적으로 matplotlib을 사용하여 일부 그림을 하드 디스크에 인쇄하고, KML 파일을 내보내고 다른 계산을 수행하며, 은 아무 것도 반환하지 않습니다..파이썬 루프가 빠르게 메모리 사용량을 늘린다.
저는 파이썬이 실행될 때마다 함수 DoDebugInfo
이 더 많은 RAM을 먹는다는 문제가 있습니다. 나는 어떤 변수가 각 루프의 크기를 증가시키고 있다고 생각한다. 프로그램이 메모리 풋 프린트를 가지고 호출하기 전에
=== before: 71598.08
=== after: 170237.952
=== before: 170237.952
=== after: 255696.896
=== before: 255696.896
=== after: 341409.792
당신이 볼 수 있듯이, 이후 :
print '=== before: ' + str(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1000)
DoDebugInfo(inputs)
print '=== after: ' + str(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1000)
출력은 다음과 같습니다
나는 호출 전후에 다음 줄을 추가 증가하는 호출이지만 다음 호출 이전까지 안정적으로 유지됩니다.왜 이럴까요? 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
을 사용하는 라인을 주석 경우
plot_line(index,alt,'-','Drive Index','Altitude in m',output_dir + 'name.png')
문제가되지 않습니다를 이 코드 라인에 누수가 있어야합니다.
감사합니다.
DoDebugInfo 함수를 보여주세요. – eumiro
아무 것도 반환하지 않는 함수는 전역 변수를 변경하거나 호출간에 정리되지 않는 가변 매개 변수를 사용할 수 있습니다. –
@eumiro 누수를 줄였습니다. DoDebugInfo 내부에서 사용하고있는 함수를 살펴보십시오. 어딘가에 누수가 있습니다. 감사합니다 – otmezger