gpt4 book ai didi

google-app-engine - AppEngine Model Memcaching 的最佳方式是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 15:18:21 25 4
gpt4 key购买 nike

目前我的应用程序像这样在 memcache 中缓存模型:

memcache.set("somekey", aModel)

但 Nicks 的帖子在 http://blog.notdot.net/2009/9/Efficient-model-memcaching建议首先将其转换为 protobuffers 效率更高。但在运行一些测试后,我发现它的尺寸确实更小,但实际上更慢 (~10%)。

其他人有同样的经历还是我做错了什么?

测试结果:http://1.latest.sofatest.appspot.com/?times=1000

import pickle
import time
import uuid

from google.appengine.ext import webapp
from google.appengine.ext import db
from google.appengine.ext.webapp import util
from google.appengine.datastore import entity_pb
from google.appengine.api import memcache

class Person(db.Model):
name = db.StringProperty()

times = 10000

class MainHandler(webapp.RequestHandler):

def get(self):

self.response.headers['Content-Type'] = 'text/plain'

m = Person(name='Koen Bok')

t1 = time.time()

for i in xrange(int(self.request.get('times', 1))):
key = uuid.uuid4().hex
memcache.set(key, m)
r = memcache.get(key)

self.response.out.write('Pickle took: %.2f' % (time.time() - t1))


t1 = time.time()

for i in xrange(int(self.request.get('times', 1))):
key = uuid.uuid4().hex
memcache.set(key, db.model_to_protobuf(m).Encode())
r = db.model_from_protobuf(entity_pb.EntityProto(memcache.get(key)))


self.response.out.write('Proto took: %.2f' % (time.time() - t1))


def main():
application = webapp.WSGIApplication([('/', MainHandler)], debug=True)
util.run_wsgi_app(application)


if __name__ == '__main__':
main()

最佳答案

无论是否使用 protobuf,Memcache 调用仍然会 pickle 对象。 Pickle 使用 protobuf 对象更快,因为它有一个非常简单的模型

普通 pickle 对象比 protobuf+pickle 对象大,因此它们在 Memcache 上节省时间,但在执行 protobuf 转换时需要更多处理器时间

因此,一般来说,这两种方法的效果都差不多……但是

你应该使用 protobuf 的原因是它可以处理模型版本之间的变化,而 Pickle 会出错。这个问题总有一天会困扰你,所以最好早点处理

关于google-app-engine - AppEngine Model Memcaching 的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2299680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com