![](/img/trans.png)
[英]Memory leak happened in Python Google App Engine project. Any efficient way to write my operation?
[英]Google App Engine Efficient Data store Read/Write Operation to Save Quota
我使用Python创建了一个Google App Engine应用。该应用处理许多用户名。
它有一个数据库以50K用户名。 每个用户名都有一个唯一的哈希值。 哪些也存储在数据存储中。
任何应用程序用户提交任何用户名。 应用程序首先检查用户名是否存在于数据库中。
如果应用程序使用新的用户名,则该应用程序将为新名称计算新的哈希,并将名称和哈希存储在DataStore中。
如果数据存储中已经存在用户名,它将从数据存储中检索旧哈希。
样例代码:
class Names(db.Model):
name = db.StringProperty(required=True)
hash = db.StringProperty(required=True)
username = "debasish"
user_db = db.GqlQuery("SELECT * FROM Names WHERE name=:1", username)
user = user_db.get()
if user == None:
#doesn't exist in DB..so calculate new hash for that name and store it in DB
e = Names(name=username,hash="badasdbashdbhasbdasbdbjasbdjbasjdbasbdbasjdbjasbd")
e.put()
else:
#retrieve the old hash.
self.response.out.write('{"name":"'+user.name+'","hash":"'+user.hash+'"}')
我面临的问题是GAE的免费数据存储读取操作配额,该配额过快并且我的应用程序停止运行。
我也曾尝试实现memcache,像这样,在memcache中添加整个数据库。 但这也是一个失败,结果更加糟糕。
def get_fresh_all(self):
all_names = db.GqlQuery("SELECT * FROM Names")
memcache.add('full_db', all_names, 3600)
return all_names
所以,你们能不能建议我,我做错什么了吗? 如何使数据存储读取操作更有效?
感谢高级。
您可以:
SELECT __key__ FROM
... user = Names.get_or_insert("debasish", hash="badasdbashdbhasbd")
您应该仅缓存用户名=哈希,而不是全部。 再加上一个内存缓存(这仅适用于每个实例缓存。应该有更多帮助,只需在全局模块级别上创建一个字典即可)。 根据您的独特点击数,它可能会迅速增长,但是您可以添加逻辑以仅保留某些数字。 这是一个示例:
cache = {}
def get_user_hash(username):
if username in cache:
return cache[username]
hash = memcache.get(username)
if not hash:
hash = # retrieve from db
if not hash:
# put to db & assign hash=new_hash
cache[username] = hash
memcache.set(username, hash)
return hash
@Faisal的方法应该可以正常工作,它为查询添加了两个缓存级别。
另一种选择是将用户名和哈希存储在会话中。 每个会话仅检查一次数据库,然后从会话变量中检索值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.