Derzeit meine Cashes Modelle in memcache wie folgt aus:Was ist der beste Weg, AppEngine Model Memcaching zu machen?
memcache.set("somekey", aModel)
Aber Nicks Beitrag bei http://blog.notdot.net/2009/9/Efficient-model-memcaching legt nahe, dass es zuerst zu protobuffers Umwandlung viel effizienter ist. Aber nach einigen Tests habe ich herausgefunden, dass es in der Tat kleiner ist, aber eigentlich langsamer (~ 10%).
Haben andere die gleiche Erfahrung oder mache ich etwas falsch?
Testergebnisse: 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()
Ich habe es gerade mit sehr großen und komplexen Modellen versucht, aber das Ergebnis war ungefähr das Gleiche. –
Vielleicht gibt es http://docs.python.org/library/timeit.html auf GAE? Dies sollte genauere Ergebnisse zeigen, aber immer noch - nach dem Lesen des Blogeintrags, mit dem ich verlinkt habe, würde ich einen Größenunterschied zwischen der Leistung von Protobuffern und Gurke erwarten - und dies sollte sowieso von time.time() abgefangen werden .. –
ich bin Mit Java Appengine, also bin ich zu faul, um diese Theorie zu testen - ist Pickle() die Ergebnisse hinter den Kulissen irgendwo zwischenspeichern, während to_protobuf nicht ist? Basierend auf dem Artikel, ich bin mir nicht sicher, dass ich eine volle Größenordnung der Erhöhung der Geschwindigkeit erwarten würde, wie Gurke immer noch aufgerufen wird, auch mit der Protobuf-Version. Der genutzte Raum könnte allerdings deutlich kleiner sein. –