2017-09-22 60 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。如果问题显然存在于第三方库中,并且找不到原因,请使用所附的报告器报告打开描述案例的故障单

相关问题