1

私は次のスクリプトを使用して、いくつかのrssスナップショットを作成しています(ちょうど言っています)。

スクリプトはバックエンドで実行され、メモリ消費量が非常に増えています。

class StartHandler(webapp2.RequestHandler):

    @ndb.toplevel
    def get(self):
        user_keys = User.query().fetch(1000, keys_only=True)
        if not user_keys:
            return
        logging.info("Starting Process of Users")
        successful_count = 0
        start_time = time.time()
        for user_key in user_keys:
            try:
                this_start_time = time.time()
                statssnapshot = StatsSnapShot(parent=user_key,
                                        property=get_rss(user_key.id())
                                        )
                #makes a urlfetch
                statssnapshot.put_async()
                successful_count += 1               
            except:
                pass
        logging.info("".join(("Processed: [",
                            str(successful_count),
                            "] users after [",
                            str(int(time.time()-start_time)),
                            "] secs")))
        return

編集

rss関数は次のように言うこともできます:

def get_rss(self, url):
        try:
            result = urlfetch.fetch(url)
            if not result.status_code == 200:
                logging.warning("Invalid URLfetch")
                return
        except urlfetch.Error, e:
            logging.warning("".join("Fetch Failed to get ",url," with",e))
            return
        content = result.content #Around 500 - 200KB
        reobj = re.compile(r'(?<=")[0-9]{21}(?=")')
        user_ids = reobj.findall(content)
        user_ids = set(user_ids)#set to fail if something is not unique
        return user_ids

スクリプトは正常に実行されますが、ユーザーが増えるにつれて、スクリプトはますます多くのメモリを消費します。CIから来た人は、Pythonでメモリと変数を効率的に操作する方法を知りません。

たとえば、Pythonの変数が再度参照されない場合、ガベージコレクターはその変数に使用されているメモリを解放することを知っていますが、私の場合はどうでしょうか。どこで間違っているのでしょうか。

このスクリプトを最適化して、メモリ使用量が増え続けるのではなく、ユーザープロセスに必要なメモリのみを消費するようにするにはどうすればよいですか?

4

1 に答える 1

2

NDBは自動キャッシュを追加します。これは通常非常に便利です。メモリキャッシュとmemcachedがあり、それらのポリシーを設定できます。

プットをするとき、あなたは文脈オプションを提供することができます、そして私は以下があなたのために働くだろうと思います:

statssnapshot.put_async(use_cache=False)
于 2013-01-22T10:45:39.090 に答える