Quelle est la meilleure méthode de sérialisation d'objets dans memcached?
Mon application en Python utilise actuellement le python-memcached API pour définir et obtenir des objets dans memcached. Cette API utilise Python natif module pickle pour sérialiser et désérialiser des objets Python.
Cette API, il est simple et rapide pour stocker imbriquée Python, les listes, les dictionnaires et les tuples dans memcached, et la lecture de ces objets dans l'application est complètement transparent -- il fonctionne, tout simplement.
Mais je ne veux pas être limité à l'aide de Python exclusivement, et si tous les objets memcache sont en série avec les cornichons, les clients écrits dans d'autres langues ne fonctionnent pas.
Voici la croix-plate-forme options de sérialisation j'ai réfléchi:
- XML - le principal avantage est qu'il est lisible par l'homme, mais ce n'est pas important dans cette application. XML prend également beaucoup d'espace, et c'est cher à analyser.
- JSON semble être une bonne croix-plate-forme standard, mais je ne suis pas sûr qu'il conserve le caractère des types d'objet lors de la lecture de retour de memcached. Par exemple, selon ce post tuples sont transformés dans des listes lors de l'utilisation de simplejson; aussi, il semble que l'ajout d'éléments à la structure JSON pourrait casser le code écrit à l'ancienne structure
- Google Protocol Buffers - Je suis vraiment intéressé par ce parce qu'il semble très rapide et compact -- au moins 10 fois plus petit et plus rapide que XML; il n'est pas lisible par l'homme, mais ce n'est pas important pour cette application; et il semble avoir été conçu pour soutenir la croissance de la structure, sans rupture de l'ancien code
Compte tenu des priorités pour cette application, ce qui est l'objet idéal méthode de sérialisation pour memcached?
- Support multi-plateforme (Python, Java, C#, C++, Ruby, Perl)
- De la manipulation de structures de données imbriquées
- Rapide de sérialisation/dé-sérialisation
- Minimum de mémoire
- La possibilité de changer de structure, sans rupture de l'ancien code
- Je pense que vous devez d'abord définir les types d'objet que vous souhaitez stocker. Vous avez déjà fait les tuples/listes de problème et de l'arbitraire des types de données que vous exécutez dans l'arbitraire des problèmes 😉
- Je pense que le point est que les types d'objet sont arbitraires.
Vous devez vous connecter pour publier un commentaire.
Un facteur important est "voulez-vous avoir à préciser à chaque structure de la définition de"?
Si vous êtes OK avec ça, alors vous pourriez jeter un oeil à:
Deux de ces solutions nécessitent une prise en charge de fichiers qui définissent chaque structure de données.
Si vous préférez ne pas encourir le développeur généraux de la pré-définition de chaque structure, puis prendre un coup d'oeil à:
Cependant, je crois que ces deux ont eu des problèmes avec le transport de contenu binaire, qui est pourquoi ils ont été écartés pour notre usage. Remarque: YAML peut avoir de bonnes binaire support, vous aurez pour vérifier que le client bibliothèques -- voir ici: http://yaml.org/type/binary.html
Au sein de notre entreprise, nous avons lancé notre propre bibliothèque (Extruct) pour la langue de la sérialisation binaire de soutien. Nous avons actuellement (décemment) rapide implémentations de Python et PHP, mais elle n'est pas très lisible grâce à l'utilisation de base64 sur toutes les chaînes (binaire de soutien). Nous finirons par nous porter vers C et utiliser en plus la norme de codage.
Langages dynamiques tels que PHP et Python vraiment lent si vous avez trop d'itérations dans une boucle ou d'avoir à chercher à chaque personnage. C sur l'autre main brille à de telles opérations.
Si vous souhaitez voir la mise en œuvre de Extruct, s'il vous plaît laissez-moi savoir. (information de contact à http://blog.gahooa.com/ sous "à Propos de Moi")
J'ai essayé plusieurs méthodes, et se sont installés comprimé JSON comme le meilleur équilibre entre la vitesse et de la mémoire. Python natif de Pickle fonction est un peu plus rapide, mais les objets qui en résultent ne peuvent pas être utilisés avec des non-Python clients.
J'en vois 3:1 de compression de sorte que toutes les données s'inscrit dans memcache et l'application de la sous-10 ms temps de réponse, y compris le rendu de la page.
Voici une comparaison de JSON, d'économie, de Tampons de Protocole et YAML, avec et sans compression:
http://bouncybouncy.net/ramblings/posts/more_on_json_vs_thrift_and_protocol_buffers/
Ressemble à ce test obtenu les mêmes résultats que j'ai fait avec compressé JSON. Comme je n'ai pas besoin de pré-définir chaque structure, cela semble être la manière la plus rapide et la plus petite de la croix-plate-forme de réponse.
"Support multi-plateforme (Python, Java, C#, C++, Ruby, Perl)"
Dommage que ce critère est le premier. De l'intention à l'origine de la plupart des langues est d'exprimer fondamentale des structures de données et de traitement différemment. C'est ce qui rend de multiples langues, un "problème": ils sont tous différents.
Une représentation unique qui est bon dans de nombreuses langues est généralement impossible. Il y a des compromis dans la richesse de la représentation, de la performance ou de l'ambiguïté.
JSON satisfait aux autres critères bien. Les Messages sont compacts et analyser rapidement (à la différence de XML). La nidification est traitée très bien. Évolution de la structure sans casser le code est toujours douteux -- si vous supprimez quelque chose, de l'ancien code de casser. Si vous modifiez quelque chose qui était nécessaire, de l'ancien code de casser. Si vous êtes en train d'ajouter des choses, cependant, JSON gère ce aussi.
J'aime lisible par l'homme. Il permet avec beaucoup de débogage et dépannage.
La subtilité d'avoir Python tuples de tourner dans des listes n'est pas un problème intéressant. La réception de la demande connaît déjà la structure en cours de réception, et peut ajuster (si il le faut.)
Modifier sur la performance.
De parser le XML et JSON documents de http://developers.de/blogs/damir_dobric/archive/2008/12/27/performance-comparison-soap-vs-json-wcf-implementation.aspx
xmlParse 0.326
jsonParse 0.255
JSON semble beaucoup plus rapide pour le même contenu. J'ai utilisé le Python SimpleJSON et ElementTree modules en Python 2.5.2.
Vous pourriez être intéressé dans ce lien :
http://kbyanc.blogspot.com/2007/07/python-serializer-benchmarks.html
Une alternative : MessagePack semble être la manière la plus rapide sérialiseur là-bas. Peut-être que vous pouvez lui donner un essai.
De hesse répond à toutes vos exigences. Il y a une bibliothèque python ici:
https://github.com/bgilmore/mustaine
La documentation officielle pour le protocole peut être trouvé ici:
http://hessian.caucho.com/
J'ai régulièrement de l'utiliser en Java et en Python. Il fonctionne et ne nécessite pas l'écriture de la définition de protocole de fichiers. Je ne pourrais pas vous dire comment le Python sérialiseur effectue, mais la version de Java est raisonnablement efficace:
https://github.com/eishay/jvm-serializers/wiki/