Как предотвратить ошибку памяти в Python при записи изображений из массивов numpy в al oop? - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь записать необработанные тепловые данные (двумерный массив значений теплового излучения на каждом временном шаге) в изображения .tiff, представляющие каждый кадр, чтобы в конечном итоге превратить их в видео с FFMPEG или openCV. Тепловые данные должны считываться в Python по одному кадру за раз (а не в виде трехмерного массива) из-за ограничений комплекта разработки программного обеспечения, которые позволяют Python получать доступ к проприетарному типу файла.

Я использую относительно простую l oop для чтения в кадре тепловых данных в виде массива Numpy, построения графика в виде тепловой карты, сохранения графика и перехода к следующему кадру. , Некоторые из тепловых видео имеют более 250 000 кадров. Свободное место на жестком диске для файлов .tiff не является ограничением. И все же, после примерно 1800 кадров, я либо получаю ошибку памяти, либо мой ноутбук jupyter просто выходит из строя (браузер отображает пустую белую страницу с надписью «Недостаточно памяти для загрузки страницы») . Посмотрев на потребление памяти Python, похоже, что Python использует все больше и больше памяти на каждой итерации l oop, хотя я не сохраняю новые переменные в каждом взаимодействии. Я вставил некоторый фиктивный код этого ниже.

Я новичок в Python и буду очень признателен за любые советы о том, как решить эту проблему, или о том, как лучше go решить эту задачу. Примечание: Я пытался использовать openCV для добавления каждого кадра непосредственно в видео без сохранения кадров на жесткий диск, и я сталкиваюсь с той же ошибкой.

from guppy import hpy
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

for i in range(10000):


    day2 = np.random.randint(10, 15)  ## saves the day associated with the 2D array (toy version of reading in the frame metadata)

    day_diff = day2 - 10 ## calculates the difference in days between the current 2D array and a starting point

    final = np.random.random( (768, 1024) ) ## initialize random 2D array (toy version of reading in thermal data)

    final1 = final - final.mean()  ## center the 2D array

    width = final.shape[1] / 20

    height = final.shape[0] / 20

    fig, ax = plt.subplots(figsize = (width, height))  ## set up plot

    ax = sns.heatmap(final1, vmin = -np.std(final1), vmax = final1.max(), xticklabels = False, yticklabels = False, cbar = False) ## plot heatmap, removing the uninteresting lower range of the temperatures

    plt.xlabel(  day_diff , fontsize = 55 ) ## add day label to x-axis

    plt.savefig( f'{i:06}_' + str(day_diff) + '.tiff' , bbox_inches = 'tight')

    plt.close()

    del fig, ax, day2, day_diff, final, final1, width, height

    h = hpy()
    print(h.heap())

Спасибо!

Картер

...