エラー(その2)

二日前のエラーの話。
同じコードをノートPCで実行したところ、”仮想メモリが不足してます...”と表示されて固まってしまった。そこでコードをよく見なおした。

ダメだったコードは下のもの。繰り返し処理をしている部分で落ちてしまう。for分の中でfig=figure()を繰り返しているのが気になってはいたのだが、for分の外側でこれを定義すると、描画される絵が重なって表示されるのでこうしていた。

    colors = ['#FFFFFF', '#FFFF33', '#FFCC99', '#CC0033']

    dnum = Util.dam_dam[0]
    for k in range(1,dnum):
        fig = figure()
        ay = fig.add_subplot(111)        
        for i in range(Util.sens_num_ini+8):
            if i >= Util.sens_num_ini:
                color = colors[0]
            else:
                color = colors[int(Util.dam_dam[k][i][0])]
            
            x = Util.cordx[i]
            y = Util.cordy[i]
            ay.fill(x, y, color)
            ay.axis('off')
        ay.text(5,100,"Front", fontsize=20)
        ay.text(53,100,"Back", fontsize=20)
        ay.text(5,-5,"Time=%s [sec]" % str(Util.dam_time[k-1]), fontsize=14)
        filename = 'anim' + str(k)
        fig.savefig(filename)

メモリにどれだけの付加がかかるのかはわからないが、これは避けるべきと考えてfor分の外側に出した。また、examplesのコードにcla()というものがあったのを思い出し、たぶんこれが画面をクリアするものと推測。そこで以下のように修正。

    colors = ['#FFFFFF', '#FFFF33', '#FFCC99', '#CC0033']

    dnum = Util.dam_dam[0]
    fig = figure()
    ax = fig.add_subplot(111)
    for k in range(1, dnum):
        cla()
        for i in range(Util.sens_num_ini+8):
            if i >= Util.sens_num_ini:
                color = colors[0]
            else:
                color = colors[int(Util.dam_dam[k][i][0])]
            
            x = Util.cordx[i]
            y = Util.cordy[i]
            ax.fill(x, y, color)
            ax.axis('off')
        ax.text(5,100,"Front", fontsize=20)
        ax.text(53,100,"Back", fontsize=20)
        ax.text(5,-5,"Time=%s [sec]" % str(Util.dam_time[k-1]), fontsize=14)
        filename = 'anim' + str(k)
        fig.savefig(filename)

動きました!実行速度も向上した(気がする)。今考えるとかなり基本的なことだったような。
お騒がせしました。