Błąd Matplotlib OverflowError: Przydzielono zbyt wiele bloków
Kreślę trzy zestawy z około 20 szeregów czasowych. Każda seria czasowa ma 1,8 miliona punktów i wykreślam je osobno. W celu skrócenia czasu wykonania (ponieważ dowiedziałem się, że funkcja figure () jest dość czasochłonna), otwieram tylko jedną figurkę, wykreślam, a następnie czyszczę ją dla następnego szeregu czasowego. Coś jak:
import matplotlib.pyplot as plt
fig = plt.figure() # open a figure for plotting
for v in range(nfigs):
# here I build the x and y vectors from the raw data
# and also the figname string
plt.plot(x, y, linewidth=0.3)
plt.title('a title')
plt.xlabel('x-label')
plt.ylabel('y-label')
plt.grid()
plt.draw()
plt.savefig(figname)
plt.clf()
plt.close() # close the figure after the job is done
Wszystkie wątki są zapisywane w porządku, z wyjątkiem jednego w szczególności we wszystkich zestawach danych, co daje następujący błąd (edytowane ścieżki plików w celu zachowania prywatności):
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 540, in runfile
execfile(filename, namespace)
File "batch.py", line 142, in <module>
main(fn)
File "batch.py", line 94, in main
plt.savefig(figname+'_'+nn+'.png')
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\pyplot.py", line 561, in savefig
return fig.savefig(*args, **kwargs)
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\figure.py", line 1421, in savefig
self.canvas.print_figure(*args, **kwargs)
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\backends\backend_qt4agg.py", line 167, in print_figure
FigureCanvasAgg.print_figure(self, *args, **kwargs)
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\backend_bases.py", line 2220, in print_figure
**kwargs)
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\backends\backend_agg.py", line 505, in print_png
FigureCanvasAgg.draw(self)
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\backends\backend_agg.py", line 451, in draw
self.figure.draw(self.renderer)
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\figure.py", line 1034, in draw
func(*args)
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\axes.py", line 2086, in draw
a.draw(renderer)
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\lines.py", line 562, in draw
drawFunc(renderer, gc, tpath, affine.frozen())
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\lines.py", line 938, in _draw_lines
self._lineFunc(renderer, gc, path, trans)
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\lines.py", line 978, in _draw_solid
renderer.draw_path(gc, path, trans)
File "~\AppData\Local\Continuum\Anaconda\lib\site-packages\matplotlib\backends\backend_agg.py", line 145, in draw_path
self._renderer.draw_path(gc, path, transform, rgbFace)
OverflowError: Allocated too many blocks
Szereg czasowy wyzwalający ten błąd nie ma w tym nic specjalnego, sprawdziłem go za pomocą prostego show () zamiast savefig (). Nie jest to ani pierwszy ani ostatni (w około 60 szeregach czasowych), ale wystarczy złamać mój skrypt. Pomoc na ten temat jest bardzo ceniona!