Frage

Meine Python-Anwendung verwendet derzeit die python-Memcached API zu setzen und erhalten Objekte in memcached. Diese API verwendet Python native Beize Modul zu serialisiert und Deserialisieren Python-Objekte.

Diese API macht es einfach und schnell verschachtelte Python-Listen, Wörterbücher zu speichern und Tupeln in Memcached, und diese Objekte wieder in die Anwendung zu lesen ist völlig transparent - es funktioniert einfach

. ich will aber nicht ausschließlich auf die Verwendung Python beschränkt, und wenn alle memcached Objekte mit Gurke serialisiert werden, dann in anderen Sprachen geschrieben Kunden wird nicht funktionieren.

Hier sind die Cross-Plattform-Serialisierung Optionen ich habe als:

  1. XML - der größte Vorteil ist, dass es für Menschen lesbarer, aber das ist in dieser Anwendung nicht wichtig. XML nimmt auch viel Platz, und es ist teuer zu analysieren.

  2. JSON - scheint wie ein guter Cross-Plattform-Standard, aber ich bin nicht sicher, ob sie den Charakter von Objekttypen beibehalten, wenn sie wieder von Memcached lesen. Zum Beispiel nach dieser Beitrag Tupeln in Listen umgewandelt werden, bei der Verwendung von simplejson ; Auch scheint es, wie Elemente der JSON-Struktur Hinzufügen von Code geschrieben zu der alten Struktur brechen könnte

  3. Google Protocol Buffers - ich bin wirklich daran interessiert, diese weil es scheint, sehr schnell und kompakt - mindestens 10 mal kleiner und schneller als XML; es ist nicht in lesbarer Form, aber das ist für diese App nicht wichtig; und es scheint, entworfen wächst die Struktur, ohne zu brechen alten Code zu unterstützen

die Prioritäten für diese App Unter Berücksichtigung, was ist das ideale Objekt Serialisierungsmethode für Memcached?

  1. Cross-Plattform-Unterstützung (Python, Java, C #, C ++, Ruby, Perl)

  2. verschachtelte Datenstrukturen Handhabung

  3. Fast Serialisierung / Deserialisierung

  4. Mindestspeicherbedarf

  5. Flexibilität der Struktur zu ändern, ohne alten Code zu brechen
War es hilfreich?

Lösung 2

Ich habe versucht, verschiedene Methoden und auf komprimierte JSON als die beste Balance zwischen Geschwindigkeit und Speicherverbrauch abgerechnet. Python native Pickle Funktion ist etwas schneller, aber die resultierenden Objekte können nicht mit nicht-Python-Clients verwendet werden.

Ich sehe 3: 1-Komprimierung so alle Daten in memcache paßt und die App wird Unter 10ms Reaktionszeiten einschließlich Seiten-Rendering

.

Hier ist ein Vergleich von JSON, Thrift, Protocol Buffers und YAML, mit und ohne Komprimierung:

http://bouncybouncy.net/ramblings/posts/more_on_json_vs_thrift_and_protocol_buffers/

Sieht aus wie dieser Test die gleichen Ergebnisse habe ich mit komprimiertem JSON tat. Da muss ich jede Struktur nicht vordefinieren, scheint dies die schnellste und kleinste plattformübergreifende Antwort.

Andere Tipps

Eine wichtige Überlegung ist, „tun Sie jede Strukturdefinition haben wollen angeben“ ?

Wenn Sie mit dem OK sind, dann könnten Sie einen Blick auf:

  1. Protocol Buffers - http://code.google.com/apis/protocolbuffers /docs/overview.html
  2. Thrift - http://developers.facebook.com/thrift/ (mehr in Richtung Dienstleistungen ausgerichtet )

Beide Lösungen erfordern die Unterstützung von Dateien jeder Datenstruktur zu definieren.


Wenn Sie nicht lieber die Entwickler Overhead vorge definieren jede Struktur entstehen, dann nehmen Sie einen Blick auf:

  1. JSON (via Python cjson und native PHP json). Beide sind wirklich sehr schnell, wenn Sie binären Inhalt nicht übertragen müssen (wie Bilder, etc ...).
  2. Noch eine Markup Language @ http://www.yaml.org/ . Auch wirklich schnell, wenn Sie die richtige Bibliothek erhalten.

Ich glaube jedoch, dass diese beiden Probleme hatten mit binären Inhalt zu transportieren, weshalb sie für unsere Nutzung ausgeschlossen wurden. Hinweis: YAML gute binäre Unterstützung haben kann, müssen Sie die Client-Bibliotheken überprüfen - siehe hier: http://yaml.org/type/binary.html


In unserem Unternehmen rollten wir unsere eigene Bibliothek (Extruct) für sprachübergreifende Serialisierung mit binärer Unterstützung. Wir haben zur Zeit (anständig) schnelle Implementierungen in Python und PHP, obwohl es nicht sehr menschlich lesbar ist aufgrund base64 auf allen Saiten (binär-Unterstützung) verwenden. Schließlich werden wir Portierung auf C und mehr Standard-Codierung verwenden.

Dynamische Sprachen wie PHP und Python bekommen wirklich langsam, wenn Sie zu viele Iterationen in einer Schleife haben oder bei jedem Zeichen zu suchen. C auf der anderen Seite scheint bei solchen Operationen.

Wenn Sie die Implementierung von Extruct sehen möchten, lassen Sie es mich wissen. (Kontaktinfos unter http://blog.gahooa.com/ unter "Über mich")

"Cross-Plattform-Unterstützung (Python, Java, C #, C ++, Ruby, Perl)"

Schade, diese Kriterien erste ist. Die Absicht hinter den meisten Sprachen ist von grundlegender Bedeutung Datenstrukturen und Verarbeitung anders auszudrücken. Das ist, was mehrere Sprachen ein „Problem“ macht: sie sind alle verschieden.

Eine einzige Darstellung, die sich über viele Sprachen gut ist, ist in der Regel nicht möglich. Es gibt Kompromisse in den Reichtum der Darstellung, die Leistung oder Mehrdeutigkeit.

JSON erfüllt die übrigen Kriterien schön. Meldungen sind kompakt und analysieren schnell (im Gegensatz zu XML). Nesting ist schön behandelt. Ändern Struktur ohne Code zu brechen ist immer zweifelhaft - wenn Sie etwas, alter Code entfernen brechen. Wenn Sie etwas ändern, die erforderlich war, wird alter Code brechen. Wenn Sie die Dinge sind fügte aber hinzu, JSON behandelt dies auch.

Ich mag in lesbarer Form. Es hilft mit vielen Debugging und Fehlersuche.

Die Subtilität mit Python Tupeln in Listen drehen ist nicht ein interessantes Problem. Die empfangende Anwendung bereits kennt die Struktur erhalten werden, und es kann zwicken (wenn es darauf ankommt.)


Bearbeiten auf die Leistung.

Parsen der XML und JSON Dokumente von 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 erscheint deutlich schneller für den gleichen Inhalt zu sein. Ich benutzen den Python simplejson und ElementTree Module in Python 2.5.2.

Sie können in diesen Link interessieren:

http://kbyanc.blogspot.com/2007/07 /python-serializer-benchmarks.html

Eine Alternative: Message scheint dort den schnellsten Serializer zu sein. Vielleicht kann man es versuchen.

hessischen erfüllt alle Ihre Anforderungen. Es gibt eine Python-Bibliothek hier:

https://github.com/bgilmore/mustaine

Die offizielle Dokumentation für das Protokoll finden Sie hier:

http://hessian.caucho.com/

ich es regelmäßig in Java und Python verwenden. Es funktioniert und erfordert nicht das Schreiben Protokolldefinitionsdatei. Ich konnte nicht sagen, wie der Python Serializer führt, aber die Java-Version ist ziemlich effizient:

https://github.com/eishay/jvm-serializers/wiki/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top