Как ускорить анимацию matplotlib из результатов базы данных? - PullRequest
0 голосов
/ 29 октября 2018

Я использую matplotlib для создания контурных графиков для некоторых карт, которые я храню в базе данных, но процесс создания каждого фильма занимает несколько часов. Код, который я использую для создания этого фильма:

def load_img(option, obs_id, columnshape):
    '''
    This function will load the image
    from the database and make the 
    conversion from string to nparray
    '''
    #starting a db session
    session = makesession()

    #defining the cases to query the db
    case = {'Bz': Observations.mean_bz,
            'Es': Observations.poyn_Es,
            'En': Observations.poyn_En,
            'Et': Observations.poyn_Et}

    #checking if the option selected was
    #a valid one
    while option not in case.keys():
        #feedback
        print('Invalid option. Select a valid one: ', case.keys())
        option = str(input())

    #querying the db
    s = sql.select([case[option]]).where(Observations.id == obs_id)

    #fetching the result
    rp = session.execute(s)
    result = rp.fetchone()

    #restoring the image
    img = ajuste(result[0],columnshape)

    return(img)

def db_animation(ar_id, option):
    '''
    Description
    '''
    vmin = -1e17
    vmax = 1e17
    levels = [vmin, 0.8*vmin, 0.6*vmin, 0.4*vmin, 0.2*vmin, 
              0.2*vmax, 0.4*vmax, 0.6*vmax,0.8*vmax,vmax]

    #getting the observation ids
    obs_ids = scout_obs_ids(ar_id)
    #obs_ids = [x for x in range(400,450)]

    #getting the columnshape
    columnshape = scout_colshape(obs_ids[0])

    #creating the figure objects
    fig, ax = plt.subplots(figsize = (12,8))

    #loading the first data
    data_bz = load_img('Bz', obs_ids[0], columnshape)
    data_E = load_img(option, obs_ids[0], columnshape)

    #making the image objects
    img1 = ax.imshow(data_bz, origin = 'lower', cmap = plt.cm.gray, 
                     animated = True)

    img2 = [ax.contourf(data_E, alpha = 0.35, 
                        #vmax = 1e17, vmin = -1e17,
                        levels = levels,
                        origin = 'lower',
                        cmap = 'PiYG')]

    #adding a colorbar
    fig.colorbar(img2[0], shrink = 0.75, label = 'W')


    def refresher(frame_number, img1,img2):
        '''
        description
        '''
        #taking the new data
        new_data_bz = load_img('Bz', obs_id = obs_ids[frame_number+1],
                               columnshape = columnshape)
        new_data_E = load_img(option, obs_id =  obs_ids[frame_number+1],
                              columnshape = columnshape)

        #setting the new data
        img1.set_data(new_data_bz)

        #removing the contours to start anew
        for tp in img2[0].collections:
            tp.remove()

        img2[0] = ax.contourf(new_data_E, alpha = 0.35, 
                              levels = levels,
                              origin = 'lower', cmap = 'PiYG')

        return(img1, img2[0].collections,)

    #using the animation function
    ani = FuncAnimation(fig, refresher,
                        frames=range(len(obs_ids)-1),
                        interval = 100,
                        #blit = True,
                        fargs = [img1,img2])

    #saving
    ani.save("test.mp4")

    return

В среднем эти фильмы получают 1200 изображений для каждого объекта img (всего около 2400) из базы данных. Каждая пара изображений загружается и восстанавливается индивидуально для создания фонового изображения и контурного графика.

Меня интересовали причины, по которым время обработки быстро увеличивалось, когда я увеличивал количество изображений для создания фильма, но я не мог прийти к собственному выводу. Я нахожу это особенно интригующим, что когда я устанавливаю для blit значение True (что в соответствии с документацией 1007 * должно помочь улучшить производительность), я получаю следующую ошибку:

AttributeError: 'silent_list' object has no attribute 'set_animated'

Я полагаю, что мои запросы или способ, которым я построил свою функцию анимации, в таком случае крайне неэффективны. Но я подозреваю больше о последнем, так как, когда я обычно использую БД, результаты загружаются в то время, которое я считаю разумным.

Может кто-нибудь пролить свет на эту борьбу за меня?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...