2015-11-03 13 views
0

Я написал сценарий, который создает анимацию (фильм) из файлов подгонки. Один файл имеет размер 2,8 МБ и номер. файлов составляет 9000. Вот кодпрочитал много файлов и создал анимацию-питон

import numpy as np 
import matplotlib 
matplotlib.use("Agg") 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
import os 
import pyfits 
import glob 
import re 



Writer = animation.writers['ffmpeg'] 
writer = Writer(fps=15, metadata=dict(artist='Me'), bitrate=1800) 

global numbers 
numbers=re.compile(r'(\d+)') 

def numericalSort(value): 
    parts = numbers.split(value) 
    parts[1::2] = map(int, parts[1::2]) 
    return parts 


image_list=glob.glob('/kalib/*.fits') 

image_list= sorted(image_list,key=numericalSort) 
print image_list 
fig = plt.figure("movie") 
img = [] 

for i in range(0,len(image_list)): 

    hdulist = pyfits.open(image_list[i]) 
    im = hdulist[0].data 
    img.append([plt.imshow(im,cmap=plt.cm.Greys_r)]) 


ani = animation.ArtistAnimation(fig,img, interval=20, blit=True,repeat_delay=0) 
ani.save('movie.mp4', writer=writer) 

Я думаю, что моя проблема в том, когда я создаю массив IMG [] ... У меня есть 8 ГБ оперативной памяти и когда оперативная память полна моя операционная система прекращает питон скрипт.

Мой вопрос: Как я могу читать 9000 файлов и создавать анимацию? Возможно ли создать некоторый буфер или некоторую параллельную обработку?

Любое предложение?

ответ

1

Возможно, вам лучше создать анимацию с помощью FuncAnimation вместо ArtistAnimation, как описано в ArtistAnimation vs FuncAnimation matplotlib animation matplotlib.animation. FuncAnimation более эффективен в использовании своей памяти. Возможно, вам захочется поэкспериментировать с параметром save_count FuncAnimation, посмотрите примеры API.

+0

Спасибо за ответ ... но я думаю, что это не моя проблема ... У меня есть проблемы с чтением массива данных из файлов IMG [] массив ... Анимация создается, когда я прочитанные array img [] –

+0

Правильно, но проблема в том, что вы не принимаете правильный подход в первую очередь. Вы не должны создавать * список * изображений с imshow, потому что каждый из них занимает память. FuncAnimation позволяет вам отображать один кадр за раз по мере необходимости, без одновременного рендеринга всех изображений. Возможно, вы можете быть более ясными о том, чего вы надеетесь достичь, но сделать большой список художников-иллюстраторов не так. – Iguananaut

+0

В качестве продолжения причина того, что вы делаете, например, сюжет линии или что-то в этом роде, состоит в том, что линии и многоугольники и т. Д. Тривиальны для представления в памяти и анимации. Целые изображения - это разные истории, и когда вы вызываете imshow, вы используете память для каждого пикселя каждого кадра. Наивный подход не сработает. – Iguananaut

2

Я бы порекомендовал вас использовать ffmpeg. С помощью команды image2pipe вам не нужно загружать все изображения в вашу оперативную память, а один за другим (я думаю) в трубу.

В дополнение к этому, ffmpeg позволяет вам управлять видео (частота кадров, кодек, формат и т. Д.).

https://ffmpeg.org/ffmpeg.html