如何修复我的应用程序中的内存泄漏?

时间:2017-09-22 07:37:41

标签: google-app-engine memory-leaks

在我的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()

我添加了许多具有不同行值的任务。

结果我得到了严重的错误'超过128 Mb的软私人限制,158 Mb'总共服务5个请求后。

这里可能有什么问题?

2 个答案:

答案 0 :(得分:1)

乍一看,您的代码中没有任何特殊内容可能会导致内存泄漏。 除非他非常熟悉所使用的第三方库及其现有错误,否则我认为没有人可以找到它。所以我会按如下方式解决问题:

  1. 首先让我们找出完全内存泄漏的位置以及它是否在泄漏。

    请参阅tracemallocmemory_profilerheapy或您熟悉的任何其他内容。此处列出了大多数可用的配置文件Which Python memory profiler is recommended?

    预期结果:您清楚地知道 内存正在泄漏,直到代码行/ python表达式

  2. 如果问题出现在第三方代码中,请尝试深入了解其代码并弄清楚其中的内容

  3. 取决于第2页结果

    一个。发布另一个SO问题,例如'为什么这个python代码摘录导致内存泄漏' - 理想情况下它应该是一个独立的代码片段,导致一个奇怪的行为,没有任何第三方库,可以在本地重现。环境规范 - 至少是python版本,表示赞赏

    湾如果问题出在第三方库中,并且您找到了问题,请在github /目标项目托管的任何地方打开错误报告

    ℃。如果问题显然出现在第三方库中并且您无法找到原因,请打开一张描述该案例的故障单并附上分析器报告

答案 1 :(得分:0)

似乎您正在运行实例类B1或F1,其内存限制为128 MB。

可能的解决方案是使用更高的instance class。但请记住,选择不同的实例类会对您的定价和配额产生影响。