Как plt.savefig обрабатывает проблемы обработчика файлов (ссылка на файл открывается / закрывается) внутри? - PullRequest
0 голосов
/ 01 февраля 2019

Я пишу код для создания графиков и сохранения их, используя метод plt.savefig в matplotlib.

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

Я попытался найти базу кода MatPlotLib и несколько вопросов StackOverflow по этому поводу и еще ничего не нашел.

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

    data_array = np.random.normal(size=10)
    plt.boxplot(data_array)
    plt.savefig(os.path.join(path_to_file,"box_plot.png"))
    plt.close()

1 Ответ

0 голосов
/ 01 февраля 2019

Это зависит от того, какой сервер вы используете для рисования ваших изображений.Из фрагмента, который вы разместили, matplotlib будет догадываться, что он должен использовать бэкэнд PNG.Что, в свою очередь, создает экземпляр matplotlib.backends.backend_agg.FigureCanvasAgg.

. Этот класс выполняет реальное сохранение следующим образом:

def print_raw(self, filename_or_obj, *args, **kwargs):
    FigureCanvasAgg.draw(self)
    renderer = self.get_renderer()
    with cbook._setattr_cm(renderer, dpi=self.figure.dpi), \
            cbook.open_file_cm(filename_or_obj, "wb") as fh:
        fh.write(renderer._renderer.buffer_rgba())

Таким образом, нет открытых висящих файлов.Файл гарантированно будет закрыт должным образом.Взгляните на исходный код .

...