我使用以下脚本创建一些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
脚本运行正常,但随着用户变得越来越多,脚本消耗的内存越来越多。 来自C我不知道如何在Python中操作内存和变量有效。
例如,我知道如果python中的varible没有被再次引用,垃圾收集器会释放用于该变量的内存,但那么似乎是我的情况以及我在哪里做错了?
如何优化此脚本不以获得增加内存使用量,但仅消耗所需的内存 用户流程?
答案 0 :(得分:2)
NDB添加了自动缓存,这通常非常方便。你有内存缓存和memcached,你可以为它们设置策略。
制作广告时,您可以提供context options,我怀疑以下内容对您有用:
statssnapshot.put_async(use_cache=False)