Превышена ошибка ограничения размера мягкого процесса. Как исправить? - PullRequest
3 голосов
/ 25 июня 2011

Я получаю следующую ошибку с моим приложением GAE:

2011-06-25 00: 15: 59.023 / опубликовать 500 30878мс 1796cpu_ms 0кб Picasa / 117,430000 (gzip), gzip (gfe)

2011-06-25 00: 15: 59.010 Превышено мягкое ограничение размера процесса с 197,977 МБ после обслуживания 16 запросов всего

Вот код:

def post(self):
    '''Here we receive photos from the GetPostDetailsHandler (/).
    We upload them to vkontakte server one-by-one (vkontakte accepts
    5 files at once, but urlfetch allows only 1 Mb per request), 
    and then save details of photos uploaded in memcache.
    Cookies are also saved there.
    '''
    # list of files for upload (max 5 files can be in the list)
    files = []
    # counts number of uploads to vkontakte server
    posts_sent = 0
    # calculate total number of files received
    # and store field names with files in files_arguments list
    arguments = self.request.arguments()
    files_arguments = []
    for argument in arguments:
        if 'localhost' in argument:
        # if not (argument in ['album', 'albums_list', 'album_custom', 'upload_url', 'album_id', 'user_id', 'body', 'title']): 
            files_arguments.append(argument) 
    logging.info('(POST) ... number of photos received: '+str(len(files_arguments)))

    logging.info('(POST) ... upload process started')
    files_counter = 0 # counts total number of files sent
    for argument in files_arguments:
        files_counter +=1
        file_size = len(self.request.get(argument))/(1024.0*1024.0)
        logging.info('(POST) ... size of file '+str(files_counter)+' is '+str(file_size)+' Mb')
        if file_size <= 1:
            files.append(MultipartParam('file1', self.request.get(argument), 'file'+str(files_counter)+'.jpg', 'application/x-www-form-urlencoded'))
            # sending file
            data, headers = multipart_encode(files)
            # try 3 times to send the file
            for i in range(3):
                try:
                    result = urlfetch.fetch(url=self.request.get('upload_url'), 
                                            payload=''.join(data),
                                            method=urlfetch.POST,
                                            headers=headers,
                                            deadline=10
                                            )              
                    break
                except DownloadError:
                    logging.error('(POST) ... error during file upload, attempt ' + str(i))
                    pass
            if result.status_code == 200:
                # save result in the memcache for 10 minutes
                memcache.add(key=self.request.get('user_id')+'_'+self.request.get('album_id')+'_'+str(files_counter), value=result.content, time=600)
                # save description in the memcache
                memcache.add(key=self.request.get('user_id')+'_'+self.request.get('album_id')+'_'+str(files_counter)+'_desc', value=self.request.get('desc'+str(files_counter)), time=600)
                logging.info('(POST) ... result of photos upload ('+str(files_counter)+'): '+result.content)
                files = []      
    # save cookies
    cookies = self.request.headers.get('Cookie')
    logging.info(cookies)
    memcache.add(key=self.request.get('user_id')+'_'+self.request.get('album_id')+'_'+'cookies', value=cookies, time=600)
    logging.info('(POST) ... upload process finished')
    # return url for Picasa - SavePhotosHandler (/save) - it will be opened in user's default browser
    # so, we have to pass there key of data we saved in memcache
    self.response.out.write('http://picasa2vkontakte.appspot.com/save?'+self.request.get('user_id')+'_'+self.request.get('album_id'))

Что здесь не так? Я также обнаружил, что такая ошибка обычно означает, что в приложении есть утечка памяти. Как это найти?

Ответы [ 2 ]

1 голос
/ 27 июня 2011

Это, вероятно, не утечка памяти - вы просто используете всю доступную память для обработки загруженных файлов. Наилучшим вариантом будет использование службы Blobstore , чтобы вообще не обрабатывать файлы самостоятельно. Кроме того, внимательно изучите свой код на наличие копий содержимого загруженных файлов (всего, что манипулирует файлами, преобразует в / из строк и т. Д.), И постарайтесь минимизировать это.

С другой стороны, поскольку похоже, что вы просто немедленно загружаете файлы в другой сервис, пусть ваши пользователи загружают прямо туда.

1 голос
/ 26 июня 2011

Таким образом, проблема возникает до того, как ваш скрипт будет выполнен.Все загруженные файлы хранятся в памяти экземпляра, и экземпляр разделяет свою память между запросами.Если многие пользователи загружают слишком большую картинку, ваш экземпляр может быть убит из-за исключения «превышен лимит памяти».

На стороне сервера вы не можете исправить проблему, но вы можете использовать плагин, такой как flash, дляпроверьте размер файлов перед загрузкой.

Или другим способом является использование сервиса blobstoreService

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...