私は次のスクリプトを使用して、いくつかの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の変数が再度参照されない場合、ガベージコレクターはその変数に使用されているメモリを解放することを知っていますが、私の場合はどうでしょうか。どこで間違っているのでしょうか。
このスクリプトを最適化して、メモリ使用量が増え続けるのではなく、各ユーザープロセスに必要なメモリのみを消費するようにするにはどうすればよいですか?