2016-08-16 2 views
0

코드 루프에서 일련의 이미지를 인쇄하려고합니다. 내 시스템이 시간에 따라 어떻게 변하는지를 보여주기 위해 궁극적으로 약 1000 인쇄 할 필요가 있습니다. Matplotlib runs out of memory when plotting in a loop에 설명 된 방법을 검토했지만 여전히 96 개 이상의 이미지를 생성하는 코드를 만들 수는 없습니다.루프에서 숫자를 그릴 때의 파이썬 메모리

for loop1 in range(0,10): 
    for loop2 in range(0,100): 
     saveName = 'Test_Images/' + str(loop1) + '_' + str(loop2) + '.png'   
     plotHeatMap(saveName,'Test','X','Y',-35,35,141,-30,30,121,Z) 

이하 그래서 상기 개방되지 않는 메모리에 대한 조언을 같이

는 I가 밖으로 제거 형태로 사용하고있는 코드는 간단한 루프에서 사용된다

import numpy as np 
import matplotlib as mpl 
import os 
def pltHM(graphname,graphtext,xAxis,yAxis,xMn,xMx,xCnt,yMn,yMx,yCnt,TCrt):  
    plt = mpl.pyplot  
    fig = plt.figure(figsize=(8,7), dpi=250) 
    cmap = mpl.cm.jet 
    norm = mpl.colors.Normalize(vmin=-3, vmax=3)   
    X = np.linspace(xMn,xMx,xCnt) 
    Y = np.linspace(yMn,yMx,yCnt) 
    plt.xlabel(xAxis) 
    plt.ylabel(yAxis) 
    plt.pcolormesh(X,Y,TCrt, cmap=cmap,norm=norm) 
    plt.grid(color='w') 
    plt.suptitle(graphtext, fontsize=14) 
    plt.colorbar() 
    plt.savefig(graphname, transparent = True) 
    plt.cla() 
    plt.clf()  
    plt.close(fig) 
    del plt  
    del fig 
    return 

이것을 이하 추적 메시지가 발생했습니다.

RuntimeError : 이미지 메모리를 할당 할 수 없습니다.

도움을 주신 것에 대해 많은 성원을 부탁드립니다.

+1

팁 : 루프에서 새로운 인물을 만들 필요는 없습니다. 숫자를 * 한 번 * 만들고, 루프 안쪽에 * 플롯을 업데이트하고 저장하십시오. 또한 매번 pyplot을 다시 정의하고 있습니다. ** 그렇게하지 마십시오. ** 한 번만하면됩니다. 맨 위에 'import matplotlib.pyplot plt'를 실행하고'plt = mpl.pyplot' 재미있는 사업을 제거하십시오. – Ajean

+0

많은 감사. 나는 이제 그것을 제거하고 캔버스 드로잉에 대한 pathoren의 제안을 사용했습니다. 지금 일하고있어. 많은 감사합니다 – ultimatejo

답변

1

다음은 할 수있는 일을 하나씩 제거한 예입니다. Ajean이 지적했듯이 매번 plt를 가져 오면 안됩니다! 한 번이면 충분합니다. 또한 그림을 삭제하지 않고 새 그림을 만들지 마십시오 ... 같은 그림을 사용하고 데이터를 대체하는 것이 좋습니다.

import numpy as np 
import matplotlib.pyplot as plt 

def plotHeatMap(fig, line, x, y, graphname): 
    line.set_data(x, y) 
    fig.canvas.draw() 
    fig.savefig(graphname) 

fig1, ax1 = plt.subplots(1, 1) 
line, = ax1.plot([],[]) 
ax1.set_xlim(0, 1) 
ax1.set_ylim(0, 1) 
for loop1 in range(0, 2): 
    for loop2 in range(0, 2): 
     x = np.random.random(100) 
     y = np.random.random(100) 
     save_name = 'fig_'+str(loop1) + '_' + str(loop2) + '.png' 
     plotHeatMap(fig1, line, x, y, save_name) 
+0

조언을 많이 주셔서 감사합니다. 캔버스에서 다시 그리기 위해 설정하고 지금 작동 중입니다. 또한 이제는 더 빨리 완료 할 수 있습니다. 도와 주셔서 정말 고맙습니다. – ultimatejo

관련 문제