Methods to avoid fail to allocate bitmap errors in pyplot
1. Problem recurrence
After repeated drawing (mainly creating figure ), even if only the local variables inside the function are defined, or the drawing has been closed with PLT. Close() , pyplot still retains some contents, but the specific part has not been found yet.
The following is a bug recurrence fragment from GitHub:
import matplotlib.pyplot as plt
import numpy as np
image = np.random.randn(256, 256, 3)
image= np.array(image/image.max()*255, dtype= np.uint8)
for i in range(500):
print(i)
plt.cla()
plt.imshow(image)
plt.close()
After running, an error will be reported when I = 369 , and the memory will continue to rise before the error is reported.
th>
TR> thead>
memory usage change td>
error screenshot td> TR> tbody> Table>
2. Reason speculation
The drawing library based on Matplotlib may create window objects during drawing, but the related objects are not released when close() , resulting in continuous memory accumulation.
3. Solutions
Define a figure and axes object and reuse it. Use cla() to clear the previous drawing content before each redrawing example 1:
import matplotlib.pyplot as plt
import numpy as np
image = np.random.randn(256, 256, 3)
image= np.array(image/image.max()*255, dtype= np.uint8)
fig, axes= plt.subplots()
for i in range(500):
print(i)
axes.cla()
axes.imshow(image)
Example 2:
import matplotlib.pyplot as plt
import numpy as np
class __:
def __init__(self):
self.fig, self.axes= plt.subplots()
def imshow(self, x):
self.axes.cla()
self.axes.imshow(image)
_= __()
image = np.random.randn(256, 256, 3)
image= np.array(image/image.max()*255, dtype= np.uint8)
for i in range(500):
print(i)
_.imshow(image)