Domanda

La mia applicazione Python attualmente utilizza API python-memcached per impostare e ottenere oggetti in memcached. Questa API utilizza per serializzare e deserializzare gli oggetti Python.

Questa API rende semplice e veloce l'archiviazione di elenchi, dizionari e tuple annidati in Python, e la lettura di questi oggetti nell'applicazione è completamente trasparente - funziona e basta.

Ma non voglio limitarmi all'uso esclusivo di Python e se tutti gli oggetti memcached sono serializzati con pickle, i client scritti in altre lingue non funzioneranno.

Ecco la serializzazione multipiattaforma opzioni che ho considerato:

  1. XML: il vantaggio principale è che è leggibile dall'uomo, ma non è importante in questa applicazione. XML richiede anche molto spazio ed è costoso da analizzare.

  2. JSON: sembra un buon standard multipiattaforma, ma non sono sicuro che mantenga il carattere dei tipi di oggetto quando viene riletto da memcached. Ad esempio, secondo questo post le tuple vengono trasformate in elenchi quando si utilizza simplejson ; inoltre, sembra che l'aggiunta di elementi alla struttura JSON potrebbe interrompere il codice scritto nella vecchia struttura

  3. Buffer di protocollo di Google - Sono davvero interessato a questo perché sembra molto veloce e compatto - almeno 10 volte più piccolo e più veloce di XML; non è leggibile dall'uomo, ma non è importante per questa app; e sembra progettato per supportare la crescita della struttura senza rompere il vecchio codice

Considerando le priorità di questa app, qual è il metodo di serializzazione degli oggetti ideale per memcached?

  1. Supporto multipiattaforma (Python, Java, C #, C ++, Ruby, Perl)

  2. Gestione delle strutture dati nidificate

  3. Serializzazione / deserializzazione rapida

  4. Minimo ingombro di memoria

  5. Flessibilità per cambiare struttura senza rompere il vecchio codice
È stato utile?

Soluzione 2

Ho provato diversi metodi e ho optato per JSON compresso come il miglior equilibrio tra velocità e footprint di memoria. La funzione Pickle nativa di Python è leggermente più veloce, ma gli oggetti risultanti non possono essere utilizzati con client non Python.

Sto vedendo la compressione 3: 1, quindi tutti i dati si adattano a memcache e l'app ottiene tempi di risposta inferiori a 10 ms incluso il rendering della pagina.

Ecco un confronto tra JSON, Thrift, Protocol Buffers e YAML, con e senza compressione:

http://bouncybouncy.net/ramblings/posts/more_on_json_vs_thrift / p_prand >

Sembra che questo test abbia ottenuto gli stessi risultati che ho fatto con JSON compresso. Dal momento che non ho bisogno di pre-definire ciascuna struttura, questa sembra la risposta multipiattaforma più veloce e più piccola.

Altri suggerimenti

Una considerazione importante è " vuoi specificare ogni definizione di struttura " ?

Se sei d'accordo, puoi dare un'occhiata a:

  1. Buffer di protocollo - http://code.google.com/apis/protocolbuffers /docs/overview.html
  2. Thrift - http://developers.facebook.com/thrift/ (più orientato ai servizi )

Entrambe queste soluzioni richiedono file di supporto per definire ciascuna struttura di dati.


Se preferisci non incorrere nel sovraccarico dello sviluppatore di pre-definire ciascuna struttura, dai un'occhiata a:

  1. JSON (tramite python cjson e nativo PHP json). Entrambi sono molto veloci se non è necessario trasmettere contenuti binari (come immagini, ecc.).
  2. Yet Another Markup Language @ http://www.yaml.org/ . Anche molto velocemente se ottieni la libreria giusta.

Tuttavia, credo che entrambi abbiano avuto problemi con il trasporto di contenuti binari, motivo per cui sono stati esclusi per il nostro utilizzo. Nota: YAML potrebbe avere un buon supporto binario, dovrai controllare le librerie client - vedi qui: http://yaml.org/type/binary.html


Presso la nostra azienda, abbiamo creato la nostra libreria (Extruct) per la serializzazione in più lingue con supporto binario. Al momento disponiamo di implementazioni (decentemente) veloci in Python e PHP, sebbene non sia molto leggibile dall'uomo a causa dell'utilizzo di base64 su tutte le stringhe (supporto binario). Alla fine li porteremo su C e useremo una codifica più standard.

I linguaggi dinamici come PHP e Python diventano davvero lenti se hai troppe iterazioni in un ciclo o devi guardare ogni personaggio. C d'altra parte brilla in tali operazioni.

Se desideri vedere l'implementazione di Extruct, faccelo sapere. (informazioni di contatto su http://blog.gahooa.com/ in " Chi sono quot;)

" Supporto multipiattaforma (Python, Java, C #, C ++, Ruby, Perl) "

Peccato che questo criterio sia il primo. L'intento alla base della maggior parte delle lingue è quello di esprimere le strutture dei dati fondamentali e l'elaborazione in modo diverso. Questo è ciò che rende più lingue un & Quot; problema & Quot ;: sono tutti diversi.

Una singola rappresentazione che è buona in molte lingue è generalmente impossibile. Vi sono compromessi nella ricchezza della rappresentazione, delle prestazioni o dell'ambiguità.

JSON soddisfa bene i restanti criteri. I messaggi sono compatti e analizzano rapidamente (diversamente dall'XML). La nidificazione è gestita bene. Cambiare la struttura senza rompere il codice è sempre incerto: se rimuovi qualcosa, il vecchio codice si romperà. Se cambi qualcosa che era richiesto, il vecchio codice si romperà. Se stai aggiungendo delle cose, tuttavia, JSON gestisce anche questo.

Mi piace la lettura umana. Aiuta con un sacco di debug e risoluzione dei problemi.

La sottigliezza di far trasformare le tuple in Python in liste non è un problema interessante. L'applicazione ricevente conosce già la struttura ricevuta e può modificarla (se è importante)


Modifica delle prestazioni.

Analisi dei documenti XML e JSON da 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 sembra essere significativamente più veloce per lo stesso contenuto. Ho usato i moduli Python SimpleJSON ed ElementTree in Python 2.5.2.

Potresti essere interessato a questo link:

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

Un'alternativa: MessagePack sembra essere il serializzatore più veloce in circolazione. Forse puoi provarlo.

Hessian soddisfa tutti i tuoi requisiti. C'è una libreria Python qui:

https://github.com/bgilmore/mustaine

La documentazione ufficiale per il protocollo è disponibile qui:

http://hessian.caucho.com/

Lo uso regolarmente sia in Java che in Python. Funziona e non richiede la scrittura di file di definizione del protocollo. Non saprei dirti come si comporta il serializzatore Python, ma la versione Java è abbastanza efficiente:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top