У меня есть много изображений, которые я рисую для целей контроля качества данных. Я использую вложенные циклы, чтобы пройти и извлекать gzipped-файлы, а затем строить и сохранять изображения как .png, чтобы впоследствии их можно было отнести. Я могу заставить его работать некоторое время, но в конце концов я получу ошибку памяти. Я не знаю, принимаю ли я тупую ошибку, любая помощь приветствуется.Ошибка памяти при построении изображений с использованием петель python
Я попытался создать временные папки для извлечения gzipped-файлов, а затем их удаления. Я также попытался закрыть все графики после того, как я делаю их каждый раз в цикле, однако я все еще получаю ошибку памяти после ее запуска некоторое время. Я сделал некоторые проблемы с поисковой системой и проблемы с очисткой и fsync, а также тот факт, что gzipped файлы находятся на внешнем жестком диске, отформатированном в NTFS, но это то, где я теряюсь.
Ниже мой соответствующий код:
while len(thelist) > 0 :
temppath = tempfile.mkdtemp()
os.chdir(temppath)
tpath = thelist.pop()
myextractor.myextract(tpath)
paths = glob('*HRV')+glob('*.IR120')+glob('*.WV73')+glob('*.VIS8')+glob('*.VIS120')+glob('*.VIS6')+glob('*.IR16')
for x in range(0, len(paths)):
#get the files and paths correct
spath ='/' + paths.__getitem__(x)
spath1 = spath.replace('\\','/')
spath = temppath+ spath1
spath = spath.replace('\\','/')
r = 0
r=McIdasObject.McIdasImageFile(spath)
#the semi colon is important ..maybe
fig = plt.imshow (np.array(r));
#most of this is just getting the correct file and path name
strpath = str(temppath)
strpath = strpath.replace('c:\\users\\appdata\\local\\temp\\','/')
folder = tpath[20]+tpath[21]+tpath[22]+tpath[23]+tpath[24]+tpath[25]+tpath[26]+tpath[27]+tpath[28]
newpath = savepath + '/' + folder
if not os.path.exists(newpath): os.makedirs(newpath)
print 'saving:' + newpath + spath1 + '.png'
plt.savefig(newpath + spath1+ '.png')
r=0
plt.close("all")
gc.collect()
os.chdir(destin)
if len(paths) < 1 :
badimages.append(temppath)
else:
shutil.rmtree(temppath)
Это след назад
Traceback (самый последний вызов последнего):
File "<ipython-input-1-22dce83b27e3>", line 1, in <module>
runfile('C:/Users/Alex/Documents/Python Scripts/image printer.py', wdir='C:/Users/Alex/Documents/Python Scripts')
File "C:\Users\Alex\Anaconda\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 682, in runfile
execfile(filename, namespace)
File "C:\Users\Alex\Anaconda\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 71, in execfile
exec(compile(scripttext, filename, 'exec'), glob, loc)
File "C:/Users/Alex/Documents/Python Scripts/image printer.py", line 57, in <module>
plt.savefig(newpath + spath1+ '.png')
File "C:\Users\Alex\Anaconda\lib\site-packages\matplotlib\pyplot.py", line 577, in savefig
res = fig.savefig(*args, **kwargs)
File "C:\Users\Alex\Anaconda\lib\site-packages\matplotlib\figure.py", line 1476, in savefig
self.canvas.print_figure(*args, **kwargs)
File "C:\Users\Alex\Anaconda\lib\site-packages\matplotlib\backends\backend_qt5agg.py", line 161, in print_figure
FigureCanvasAgg.print_figure(self, *args, **kwargs)
File "C:\Users\Alex\Anaconda\lib\site-packages\matplotlib\backend_bases.py", line 2211, in print_figure
**kwargs)
File "C:\Users\Alex\Anaconda\lib\site-packages\matplotlib\backends\backend_agg.py", line 521, in print_png
FigureCanvasAgg.draw(self)
File "C:\Users\Alex\Anaconda\lib\site-packages\matplotlib\backends\backend_agg.py", line 469, in draw
self.figure.draw(self.renderer)
File "C:\Users\Alex\Anaconda\lib\site-packages\matplotlib\artist.py", line 59, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "C:\Users\Alex\Anaconda\lib\site-packages\matplotlib\figure.py", line 1085, in draw
func(*args)
File "C:\Users\Alex\Anaconda\lib\site-packages\matplotlib\artist.py", line 59, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "C:\Users\Alex\Anaconda\lib\site-packages\matplotlib\axes\_base.py", line 2110, in draw
a.draw(renderer)
File "C:\Users\Alex\Anaconda\lib\site-packages\matplotlib\artist.py", line 59, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "C:\Users\Alex\Anaconda\lib\site-packages\matplotlib\image.py", line 373, in draw
im = self.make_image(renderer.get_image_magnification())
File "C:\Users\Alex\Anaconda\lib\site-packages\matplotlib\image.py", line 597, in make_image
transformed_viewLim)
File "C:\Users\Alex\Anaconda\lib\site-packages\matplotlib\image.py", line 219, in _get_unsampled_image
x = (x * 255).astype(np.uint8)
MemoryError
Исправьте отступ кода в вашем вопросе. Где вы получаете MemoryError? Пожалуйста, добавьте трассировку, когда это произойдет с вашим вопросом. – martineau
ОК я запускаю код, чтобы получить ошибку, – new2python
Попробуйте положить все, кроме последней строки кода в поле «for x in» (0, len (paths)): 'loop в отдельную функцию и вызвать ее в цикл, за которым следует вызов 'gc.collect()'. Возвращение из новой функции будет относить все локальные переменные, определенные в ней, и это может позволить сборщику мусора выполнять лучшую работу. – martineau