2015-07-15 6 views
0

У меня есть много изображений, которые я рисую для целей контроля качества данных. Я использую вложенные циклы, чтобы пройти и извлекать 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 
+0

Исправьте отступ кода в вашем вопросе. Где вы получаете MemoryError? Пожалуйста, добавьте трассировку, когда это произойдет с вашим вопросом. – martineau

+1

ОК я запускаю код, чтобы получить ошибку, – new2python

+0

Попробуйте положить все, кроме последней строки кода в поле «for x in» (0, len (paths)): 'loop в отдельную функцию и вызвать ее в цикл, за которым следует вызов 'gc.collect()'. Возвращение из новой функции будет относить все локальные переменные, определенные в ней, и это может позволить сборщику мусора выполнять лучшую работу. – martineau

ответ

0

Вот простой пример того, что это то же самое, твоя проблема. На моей машине, это приводит к IPython использовать всю память, а затем аварии:

import matplotlib.pyplot as plt 
import numpy as np 

for ii in np.arange(1000): 
    fig = plt.imshow(np.random.random([1000,1000])) 

(В следующий раз, если вы можете понять это, попробуйте привести пример, как это, что это столь же мало, как это возможно, удаление всех необязательный код).

Вместо того, чтобы воссоздать фигуру, каждый раз, попытайтесь создать фигуру раз и повторно использовать его:

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.imshow(np.random.random([1000,1000])) 
for ii in np.arange(1000): 
    fig.set_data(np.random.random([1000,1000])) 
+0

Хорошо Спасибо, я постараюсь завтра и посмотрю, работает ли это. – new2python

+0

Итак, я попробовал повторно использовать фигуру, и все мои изображения на выходе были перепутаны, для справки - 2500-2500 или 3725 378 или 5000 500 или 11300, 11300. Это не сработало ни для одного из них. Кроме того, когда я устанавливаю «plt.close (« all ») после« fig = plt.imshow (np.random.random ([1000,1000]) «код не сбой ...? – new2python

+0

Я также просто тестировал на размер 5000 000 000, и он действительно разбился, поэтому я продолжу работу над ним – new2python

Смежные вопросы