2014-01-16 16 views
2

我使用web.py編寫一個小程序,並在其中一個類中使用numpy/plot。numpy plot在幾分鐘後創建圖失敗idel

我發現每一次我訪問該頁面,它都能正常工作。但幾分鐘後,plt.figure()函數凍結!這個函數永遠不會返回!這太奇怪了。

請看看我的代碼:

def DrawMapMain(MapParameter,inputfile='out.txt',imgfile='out.png'): 
    print "DrawMapMain..." 
    plt.ioff() # turn off interactive mode 
    plt.close('all') 
    xmin,xmax,ymin,ymax = MapParameter['xmin'],MapParameter['xmax'],MapParameter['ymin'],MapParameter['ymax'] 
    print('LevelFile:',MapParameter['LevelFile']) 
    LonCenter = (xmin+xmax)/2.0 
    LatCenter = (ymin+ymax)/2.0 
    nx, ny = 200,200 
    if(not os.path.isfile(inputfile)): 
     print(u'輸入文件%s不存在,請檢查!'%(inputfile)) 
     sys.exit(0) 
    Region = np.loadtxt(inputfile) 
    #print(Region) 
    x,y,z = Region[:,1],Region[:,2],Region[:,3] 
    lon_array = np.linspace(xmin, xmax, nx) 
    lat_array = np.linspace(ymin, ymax, ny) 

    print('Data lon/lat box :',x.min(),x.max(),y.min(),y.max()) 
    print(u'離散點插值到網格') 
    zi,xi,yi = Interpolater.griddata_all(x,y,z,lon_array,lat_array,func='line_rbf')#scipy_idw')# #line_rbf 
    print(u'擴展矩陣插值: ') 
    zi,xi,yi,lon_array,lat_array,nx,ny=Interpolater.extened_grid(zi,lon_array,lat_array,zoom=int(2)) # 
    print(u'mask非繪圖區域') 
    grid1 = Interpolater.build_inside_mask_array(MapParameter['ShapeFile'],lon_array,lat_array) 
    zi[np.logical_not(grid1)]=np.NaN 

    #----------------------------------------------------------------------------------- 
    print(u'Create figure...') 
    #fig = plt.figure(num=1,figsize=(12, 9), dpi=100) 
    fig = plt.figure(figsize=(12, 9), dpi=100) 
    #fig = plt.figure() 
    print(u'Create figure...Done') 
    .........skipped 

我第一次訪問該頁面,我得到:

mask非繪圖區域 
Create figure... 
Create figure...Done 
(104, 35, 108, 39.5) 

這是確定的,但一段時間後,再次訪問,我有:

mask非繪圖區域 
Create figure... 

我可以看到進程'python'佔用我CPU的25%(它有4個核心),這意味着它會陷入死循環!

這是我的web.py類,以供參考:

class Month: 
    def POST(self): 
     form = ParameterForm() 
     if not form.validates(): 
      return render.Month(form) 
     else: 
      StationInfoFile='./StationsId.txt' # make sure this file is exist. 
      if(not os.path.isfile(StationInfoFile)): 
       print(u'StationInfoFile 文件%s不存在!'%(inputfile)) 
       sys.exit(0) 
      StationsInfo = np.loadtxt(StationInfoFile) # load all data as integer and float, not string 
      StationsId,StationsLon,StationsLat = StationsInfo[:,0].astype(np.int64),StationsInfo[:,1],StationsInfo[:,2] 
      basedir, DataCats, DataCatsDict=u'D:/測試數據',[ u'逐日平均', u'逐日降水'],{ u'逐日平均':'td', u'逐日降水':'rd'} 
      iFrom,iEnd= \ 
       int(form['Start Year'].value)*10000+ int(form['Start Month'].value)*100+ int(form['Start Day'].value), \ 
       int(form['End Year'].value)*10000+ int(form['End Month'].value)*100+ int(form['End Day'].value) # value from form is string! 

      MapParameter=GetMapParameter() 
      if (u'溫度' == form['Data Source'].value): 
       d=u'逐日平均' 
       tmpDataTxt='Test_temp.txt' 
       tmpOutPNG='./static/'+'Test_temp.png' 
       MapParameter['LevelFile']='.\maplev_temp.LEV' 
       MapParameter['Title']=u'逐日平均' 
      elif (u'降水(mm)' == form['Data Source'].value): 
       d=u'逐日降水' 
       tmpDataTxt='Test_pred.txt' 
       tmpOutPNG='./static/'+'Test_temp.png' 
       MapParameter['LevelFile']='.\maplev_rain.LEV' 
       MapParameter['Title']=u'逐日降水' 
      else: 
       print "form['Data Source'].value=",form['Data Source'].value 
      print "----------- PROCESSING FOR CATEGORY:",d 
      tmpMeanVal=[] 
      for i in range(len(StationsId)): 
       s,lo,la=StationsId[i],StationsLon[i],StationsLat[i] 
       #print basedir,d, str(s),DataCatsDict[d]+'.txt' 
       datafile=os.path.join(basedir,d, str(s))+DataCatsDict[d]+'.txt' 
       print datafile,iFrom,iEnd 
       data=getdata.GetData(datafile,iFrom,iEnd) 
       a=np.mean(np.array(data)[:,1])*0.1 
       tmpMeanVal.append([s,lo,la,a]) 
      rec=np.array(tmpMeanVal,dtype=[('int','int'),('float','float')]) 
      print 'Writing data ...' 
      np.savetxt(tmpDataTxt,tmpMeanVal,fmt="%6i %-7.2f %-7.2f %8.2f") 
      print 'Writing data ... Done.' 
      sssss=open(tmpDataTxt,'r') 
      print sssss.read() 
      sssss.close() 
      DrawMapMain(MapParameter,inputfile=tmpDataTxt,imgfile=tmpOutPNG) 
      return render.Reports(tmpOutPNG) 

首先,我懷疑plt.figure可能有一些內存泄漏問題,所以我我們clfplt.close('all')在開始和結束功能都!我甚至寫了一段測試代碼:

if __name__ == "__main__": 
    MapParameter=GetMapParameter() 
    MapParameter['LevelFile']='.\maplev_rain.LEV' 
    MapParameter['Title']=u'逐日降水' 
    for iloop in range(0,10): 
     DrawMapMain(MapParameter,inputfile='Test_pred.txt',imgfile='c:/Test_pred'+str(iloop)+'.png') 
    MapParameter['LevelFile']='.\maplev_temp.LEV' 
    MapParameter['Title']=u'逐日temp' 
    for iloop in range(0,10): 
     DrawMapMain(MapParameter,inputfile='Test_temp.txt',imgfile='c:/Test_temp'+str(iloop)+'.png') 

這段代碼工作正常。它是如此的有線,有人知道一些線索?很感謝!

+2

什麼matplotlib後端您使用的?如果你是從網絡服務器上運行的東西,你應該使用其中一種非交互式的。例如。做'import matplotlib; matplotlib.use('Agg')'_before_'import matplotlib.pyplot as plt'。 –

+0

感謝您的回覆,讓我試試! – user2545464

+0

再次感謝你,喬。我嘗試過,它的工作原理!謝謝你。我以前從未使用'agg',所以我不知道什麼是'後端',現在我知道了。 – user2545464

回答

1

這個問題在評論一個答案:

什麼matplotlib後端您使用的?如果你是從網絡服務器上運行的東西,你應該使用其中一種非交互式的。例如。請輸入matplotlib; matplotlib.use('Agg')在將matplotlib.pyplot導入爲plt之前。 - 喬金頓1月16日在17:56

有關matplotlib後端的更多信息,請參見:http://matplotlib.org/faq/usage_faq.html#what-is-a-backend - 喬金頓1月17日在15:21