2009-07-20 6 views
2

J'ai une liste d'entités que je veux stocker dans le memcache. Le problème est que j'ai de grands modèles référencés par leur ReferenceProperty qui sont automatiquement stockés dans le memcache. En conséquence, je dépasse la limite de taille pour les objets stockés dans memcache.Entités memcache sans ReferenceProperty

Est-il possible d'empêcher le ReferenceProperties de de charger les modèles référencés tout en les mettant dans memcache?

J'ai essayé quelque chose comme

def __getstate__(self): 
    odict = self.__dict__.copy() 
    odict['model'] = None 
    return odict 

dans la classe que je veux stocker dans memcache, mais cela ne semble pas faire l'affaire.

Toutes les suggestions seraient grandement appréciées.

Édition: J'ai vérifié en ajoutant une instruction de consignation que le __getstate__ -Method est exécuté.

+0

+1. Êtes-vous sûr que __getstate__ est exécuté? –

+0

J'ai tendance à stocker des clés dans des propriétés autres que ReferenceProperties pour éviter cela et d'autres problèmes liés à la charge paresseuse, mais je suppose que ce n'est pas la réponse que vous cherchez – gravitation

Répondre

0
odict = self.copy() 
del odict.model 

serait probablement mieux que d'utiliser dict (sauf si getstate doit retourner dict - je ne suis pas familier avec elle). Vous ne savez pas si cela résout votre problème, cependant ... Vous pouvez implémenter del dans Model pour tester si elle est libérée. Pour moi, il semble que vous ayez toujours une référence quelque part.

Vérifiez également le module de pickle - vous devez tout stocker sous une seule clé, mais il vous protège automatiquement de plusieurs références au même objet (ne le stocke qu'une seule fois). Désolé aucun lien, client mobile;)

Bonne chance!

1

Pour les entités volumineuses, vous pouvez gérer manuellement le chargement des entités associées en stockant les clés des entités volumineuses comme autre chose que ReferenceProperty. De cette façon, vous pouvez choisir quand charger la grande entité et quand ne pas le faire. Utilisez simplement un identifiant de magasin de propriétés long ou une propriété de chaîne pour stocker les noms de clé.