Incrementar uso de memcache para DB

Revisando código, he visto como el datastore de App Engine utiliza la memcache para agilizar tareas y la velocidad de respuesta al cliente. He encontrado un manual verdadereamente interesante que permite modificar el uso por defecto de la memcache para DB Model e incrementar la velocidad de respuesta hasta en 3 veces.

No he podido realizar aún pruebas para el nuevo API NDB Model pero los resultados en DB prometen mucho. Básicamente se trata de utilizar la librería marshal en lugar de cPickle.

Para el que no esté al tanto de lo que son estas dos librerías, se utilizan para serialización de objetos python.

Los dos problemas básicos que tiene cPickle son:

  1. Es muy lento.
  2. La salida que devuelve es muy grande comparado con marshal.

El único inconveniente hasta la fecha es que marshal no permite serializar objetos que no sean objetos nativos de Python por lo que antes de hacer este pequeño truco deberás convertir tus entities a objetos puros de Python.

class User(db.Model):
  email = db.StringProperty()
  birthdate = db.DateProperty()
  status = db.StringProperty()

def memcachePut(user):
  array = [ user.email,
            time.mktime(user.birthdate.timetuple()),
            user.status ]
  memcache.puts(user.key().name(), marshal.dumps(array))

def memcacheGet(key_name):
  string = memcache.gets(key_name)
  if string:
    array = marshal.loads(string)
    return User(key_name=key_name,
                email=array[0],
                birthdate=datetime.datetime.fromtimestamp(array[1]),
                status=array[2])

Este cambio te permitrá incrementar por 3 las operaciones de memcache.

Link:

Leave a comment

Create a website or blog at WordPress.com

Up ↑