plt.savefig 如何在内部处理文件处理程序问题(文件引用 open/close)?
How does plt.savefig handle file handler issues(file reference open/close) internally?
我正在编写代码来创建绘图并使用 matplotlib 中的 plt.savefig 方法保存它们。
我想知道此函数如何处理文件处理问题(准确地说是关闭文件句柄),并确定在我创建大量此类图时这是否不会导致内存管理问题。
我尝试查找 MatPlotLib 的代码库和一些与此相关的 Whosebug 问题,但还没有找到任何东西。
我的猜测是,因为我没有创建文件处理程序,所以不存在任何要关闭的引用。然而,我想确定这个假设,并想了解后端到底发生了什么。
data_array = np.random.normal(size=10)
plt.boxplot(data_array)
plt.savefig(os.path.join(path_to_file,"box_plot.png"))
plt.close()
这取决于您实际使用哪个后端来绘制图像。从您发布的代码片段中,matplotlib 会猜测应该使用 PNG 后端。
这又创建了一个 matplotlib.backends.backend_agg.FigureCanvasAgg
.
的实例
这个 class 的实际节省是这样的:
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())
所以没有悬空的打开文件。该文件保证正确关闭。
看看the source code.
我正在编写代码来创建绘图并使用 matplotlib 中的 plt.savefig 方法保存它们。
我想知道此函数如何处理文件处理问题(准确地说是关闭文件句柄),并确定在我创建大量此类图时这是否不会导致内存管理问题。
我尝试查找 MatPlotLib 的代码库和一些与此相关的 Whosebug 问题,但还没有找到任何东西。
我的猜测是,因为我没有创建文件处理程序,所以不存在任何要关闭的引用。然而,我想确定这个假设,并想了解后端到底发生了什么。
data_array = np.random.normal(size=10)
plt.boxplot(data_array)
plt.savefig(os.path.join(path_to_file,"box_plot.png"))
plt.close()
这取决于您实际使用哪个后端来绘制图像。从您发布的代码片段中,matplotlib 会猜测应该使用 PNG 后端。
这又创建了一个 matplotlib.backends.backend_agg.FigureCanvasAgg
.
这个 class 的实际节省是这样的:
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())
所以没有悬空的打开文件。该文件保证正确关闭。 看看the source code.