2017-09-22 62 views
0

在我的GAE應用程序中,我將行添加到Google Spreadsheet。如何解決我的應用程序中的內存泄漏問題?

taskqueue.add(url='/tabletask?u=%s' % (user_id), 
retry_options=taskqueue.TaskRetryOptions(task_retry_limit=0), 
          method='GET') 

class TableTaskHandler(webapp2.RequestHandler): 
    def get(self): 
     user_id = self.request.get('u') 
     if user_id: 
      try: 
       tables.add_row(
        user_id 
       ) 
      except Exception, error_message: 
       pass 



def get_google_api_service(scope='https://www.googleapis.com/auth/spreadsheets', api='sheets', version='v4'): 
    ''' Login to Google API with service account and get the service 
    ''' 
    service = None 
    try: 
     credentials = AppAssertionCredentials(scope=scope) 
     http = credentials.authorize(httplib2.Http(memcache)) 
     service = build(api, version, http=http) 
    except Exception, error_message: 
     logging.exception('Failed to get Google API service, exception happened - %s' % error_message) 
    return service 

def add_row(user_id, user_name, project_id, question, answer, ss_id=SPREADSHEET_ID): 
    service = get_google_api_service() 
    if service: 
     values = [ 
      [ 
       user_id, user_name, project_id, question, answer # 'test1', 'test2' 
      ], 
      # Additional rows ... 
     ] 
     body = { 
      'values': values 
     } 
     # https://developers.google.com/sheets/api/guides/values#appending_values 
     response = service.spreadsheets().values().append(
      spreadsheetId=ss_id, 
      range='A1:E1000', 
      valueInputOption='RAW', 
      body=body).execute() 

我用不同的行值添加了很多任務。

因此,在總共處理了5個請求之後,我得到了嚴重錯誤'超過128 Mb的軟專用限制(158 Mb)'。

這裏有什麼問題?

+0

這裏有幾篇關於任務隊列引起的內存問題的文章。這是相當複雜的,所以我建議查看這些帖子,然後根據需要更新您的問題。這裏有一個例子:https://stackoverflow.com/questions/33036334/memory-leak-in-google-ndb-library –

+0

@ JeffO'Neill,這個問題是關於NDB而不是任務隊列。而且,我只在遇到內存泄漏時才執行任務隊列(在任務隊列使用之前)。 –

+0

我遇到了一個與service.spreadsheets()。values()類似的內存泄漏,如果範圍大於100,則獲取或追加。你有沒有設法解決這個問題? @LA_ –

回答

0

看起來您正在運行實例類B1或F1,其內存限制爲128 MB。

可能的解決方案是使用更高的instance class。但請記住,選擇不同的實例類會影響您的定價和配額。

+0

謝謝,邁克爾,這正是我所做的,但即使是B4實例,我也有內存泄漏。 –

1

乍一看,代碼中沒有什麼特別的東西可能導致內存泄漏。 我不認爲有人可以找到它,除非他非常熟悉使用的第三方庫和他們現有的錯誤。所以我如下會解決這個問題:

  1. 首先讓找出確切內存泄漏及是否漏水的。

    請參閱tracemalloc,memory_profiler,heapy或其他任何您熟悉的內容。可大多數剖析這裏列出Which Python memory profiler is recommended?

    預期的結果:你很清楚地知道其中完全內存泄漏,由代碼行/ Python表達式

  2. 如果問題出在第三方代碼,試圖深入挖掘它的代碼,並找出什麼是那裏

  3. 根據第2頁結果

    一個。發佈另一個SO問題,比如'爲什麼這個python代碼片段導致內存泄漏' - 理想情況下,它應該是一個獨立的代碼片段,導致一個奇怪的行爲,沒有任何第三方庫,並且可以在本地重現。環境規範 - 至少蟒蛇版本,讚賞

    b。如果問題出在第三方庫中,並且您已找到問題,請在github /目標項目託管的任何位置打開錯誤報告。

    c。如果問題顯然存在於第三方庫中,並且找不到原因,請使用所附的報告器報告打開描述案例的故障單

相關問題