2011-06-25 32 views
3

私はGAEのアプリケーションで、次のエラーを取得しています:ソフトプロセスサイズ制限エラーを超えました。直し方?

2011年6月25日00:15:59.023 /パブリッシュ500 30878ms 1796cpu_ms 0キロバイト のPicasa/117.430000(GZIP)、GZIP(GFE)

2011年6月25日00:15:16の要求にサービスを提供した後、197.977メガバイト とソフトプロセス・サイズ制限を超え59.010ここ

を合計コードであります:

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')) 

ここで何が間違っていますか?私はまた、このようなエラーは通常、アプリケーションでメモリリークがあることを意味します。それを見つける方法?

+0

各インスタンスで使用されるメモリは平均して何ですか?アップロードされたすべてのデータはメモリに保存されるため、ユーザーが大きな画像をアップロードすると、スクリプトが許容されるメモリの上限を超えることがあります。 – sahid

+0

@sahid、どのようにしてメモリ使用量を確認できますか?これを避けるために私は何ができますか? –

答えて

1

これを使用することですメモリリークではありません - あなたは、単純にアップロードされたファイルを扱うすべての利用可能なメモリを使用しています。最良の選択肢は、自分でファイルを処理することを避けるためにBlobstoreサービスを使用することです。代わりに、アップロードされたファイルの内容がコピーされるインスタンス(ファイルを操作したり、文字列に/から変換するものなど)を慎重に調べ、それを試して最小化してください。

代わりに、すぐに別のサービスにファイルをアップロードしているように見えるので、代わりにユーザーに直接アップロードさせるようにしてください。

1

スクリプトが実行される前に問題が発生しています。アップロードされたすべてのファイルはインスタンスのメモリに保存され、インスタンスは要求の間に自分のメモリを共有します。 多くのユーザーが大きすぎる画像をアップロードすると、「超過メモリ制限」例外によってインスタンスが強制終了される可能性があります。

サーバー側では問題を修正できませんが、アップロードの前にファイルのサイズを確認するためにFlashなどのプラグインを使用できます。

それとも別の方法で、おそらくサービスblobstoreService

+0

これは、スクリプトが実行される前に発生していませんでした。これは_soft_メモリの制限を超えており、返されたものとは別に500が返されました。 –

+0

私の場合、この例外はアップロード中に起動されますスクリプトが実行されます。 – sahid

+0

スクリプトが実行を開始する前にソフト・メモリ・リミット・エラー_が発生しません。それがソフトリミットであるという事実は、インスタンスがシャットダウンされる前に要求が完了することを許可したことを意味します。 –

関連する問題