утечка памяти при запуске анимационного кода Python - PullRequest
0 голосов
/ 03 октября 2018

Я собрал воедино этот код, который открывает куб данных и строит соответствующие изображения вдоль определенной оси в цикле.Куб 5D, но сохранен как 3d куб, где три последних димса упакованы следующим образом.idx = t*nw*ns + s*nw + w с t, являющимся шагом по времени, s параметром Стокса и w длиной волны.Распаковать его и пройтись по нему легко, но когда я запускаю этот код некоторое время (> 5 с), он значительно замедляется, и если я держу его открытым более 20 секунд, он замораживает мой компьютер.

Я думаю, что это потому, что я должен очистить фигуру после перерисовки, но подпрограмме не нравится иметь какие-либо plt.clf () в главном цикле.Есть ли умный способ сделать это?

def animatecrisp(cube, dim, nw, nt, cut=50, t=0, s=0, w=0, ns=4):
    fig = plt.figure()
    '''
        cubes are formated as an entire scan for one time and stokes.

        Uses global vars: var, s, t, w, meanim, stdim


        '''

    #plot once to establish window
    idx = t*nw*ns + s*nw + w
    im = sl.get(cube,idx)[cut:-cut, cut:-cut]
    global meanim, stdim #make global to use inside loop
    meanim = np.mean(im)
    stdim = np.std(im)
    a = plt.imshow(im, vmax=meanim+2*stdim, vmin=meanim-2*stdim, cmap='gray', animated=True)

    #Check which variable we are looping over
    global var #make global to inside loop
    var = 0
    var_counter = 0
    if dim == 't':
        var_counter = nt
    elif dim == 's':
        var_counter = ns
    elif dim == 'w':
        var_counter = nw
    else:
        raise ValueError("Dim must be t,s or w.")


    def updatefig(*args):
        global var, s, t, w, meanim, stdim


        var += 1
        if var == var_counter:
            var = 0

        if dim == 't':
            t = var
        elif dim == 's':
            s = var
        elif dim == 'w':
            w = var
        else:
            raise ValueError("Dim must be t,s or w.")

        idx = t*nw*ns + s*nw + w
        im = sl.get(cube,idx)[cut:-cut, cut:-cut]
        meanim = np.mean(im)
        stdim = np.std(im)

        if mn==sd and mn==0:
            a = plt.imshow(im, vmax=meanim+2*stdim, vmin=meanim-2*stdim, cmap='gray', animated=True)
        else:
            a = plt.imshow(im, vmax=mn+2*sd, vmin=mn-2*sd, cmap='gray', animated=True)
        print(a,t,s,w, meanim, stdim)

        return a,

    ani = animation.FuncAnimation(fig, updatefig, fargs=(t,s,w),  interval=50, blit=True)
    plt.colorbar()
    plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...