memcached のオブジェクトに最適なシリアル化方法は何ですか?
-
20-08-2019 - |
質問
私の Python アプリケーションは現在、 Python-memcached API memcached でオブジェクトを設定および取得します。この API は Python のネイティブを使用します ピクルスモジュール Python オブジェクトをシリアル化および逆シリアル化します。
この API を使用すると、入れ子になった Python リスト、辞書、タプルを memcached に簡単かつ高速に保存でき、これらのオブジェクトをアプリケーションに読み戻すことは完全に透過的であり、そのまま機能します。
しかし、Python のみの使用に限定されることは望ましくありません。すべての memcached オブジェクトが pickle でシリアル化されている場合、他の言語で書かれたクライアントは動作しなくなります。
私が検討したクロスプラットフォームのシリアル化オプションは次のとおりです。
- XML - 主な利点は人間が判読できることですが、このアプリケーションではそれは重要ではありません。また、XML は多くのスペースを必要とし、解析にコストがかかります。
- JSON - 優れたクロスプラットフォーム標準のように思えますが、memcached から読み取ったときにオブジェクト型の性質が保持されるかどうかはわかりません。たとえば、次のように この郵便受け タプルは使用時にリストに変換されます シンプルな;また、JSON 構造に要素を追加すると、古い構造に書かれたコードが壊れる可能性があるようです
- Googleプロトコルバッファ - これは非常に高速でコンパクトなため、非常に興味があります。XML よりも少なくとも 10 倍小さく、高速です。人間が判読できるものではありませんが、このアプリにとっては重要ではありません。古いコードを壊さずに構造の成長をサポートするように設計されているようです
このアプリの優先順位を考慮すると、memcached にとって理想的なオブジェクトのシリアル化方法は何でしょうか?
- クロスプラットフォームのサポート (Python、Java、C#、C++、Ruby、Perl)
- ネストされたデータ構造の処理
- 高速シリアル化/逆シリアル化
- 最小メモリ占有量
- 古いコードを壊すことなく構造を変更できる柔軟性
解決 2
私はいくつかの方法を試してみましたが、スピードとメモリフットプリントの最適なバランスとして、圧縮JSONに落ち着きました。 Pythonのネイティブピックル機能がわずかに速いですが、結果オブジェクトは非Pythonのクライアントで使用することはできません。
すべてのデータがmemcacheの中に収まり、アプリはページのレンダリングを含むサブ10msの応答時間を取得するように、1圧縮私は3を見ています。
ここでJSON、スリフト、プロトコルバッファとYAMLの比較をして、圧縮せずに、ですます:
http://bouncybouncy.net/ramblings/posts/more_on_json_vs_thrift_and_protocol_buffers/する
このテストは、私は圧縮されたJSONで行った同じ結果を得たように、が見えます。私はする必要はありませんので、それぞれの構造を事前に定義し、これは最速と最小のクロスプラットフォームの答えのように思える。
他のヒント
主な考慮事項の 1 つは、「各構造定義を指定する必要があるかどうか」です。?
それでよろしければ、以下をご覧ください。
- プロトコル バッファ - http://code.google.com/apis/protocolbuffers/docs/overview.html
- スリフト - http://developers.facebook.com/thrift/ (よりサービスに特化したもの)
これらのソリューションは両方とも、各データ構造を定義するためのサポート ファイルが必要です。
各構造を事前定義する開発者のオーバーヘッドが発生したくない場合は、以下を参照してください。
- JSON (Python cjson およびネイティブ PHP json 経由)。バイナリ コンテンツ (画像など) を送信する必要がない場合、どちらも非常に高速です。
- さらに別のマークアップ言語 @ http://www.yaml.org/. 。また、適切なライブラリを入手すれば非常に高速です。
ただし、これらは両方ともバイナリ コンテンツの転送に問題があるため、使用から除外されたと思います。 注記: YAML には優れたバイナリ サポートがある可能性があります。クライアント ライブラリを確認する必要があります。ここを参照してください。 http://yaml.org/type/binary.html
当社では、バイナリ サポートを備えた言語間シリアル化用の独自のライブラリ (Extruct) を開発しました。現在、Python と PHP で (十分に) 高速な実装が行われていますが、すべての文字列で Base64 を使用している (バイナリ サポート) ため、人間が読みやすいものではありません。最終的には、それらを C に移植し、より標準的なエンコーディングを使用する予定です。
PHP や Python などの動的言語は、ループ内の反復が多すぎる場合、または各文字を確認する必要がある場合に非常に遅くなります。一方、C はそのような操作で輝きます。
Extruct の実装を確認したい場合は、お知らせください。(連絡先は次のとおりです http://blog.gahooa.com/ 「私について」の下)
"クロスプラットフォームのサポート(PythonやJavaの、C#、C ++、Rubyの、Perlの)"
この基準は初めてですあまりにも悪いです。ほとんどの言語の背後にある意図は異なった基本的なデータ構造と処理を表明することにあります。それは「問題」は、複数の言語を作るものです:彼らはすべての異なるです。
多くの言語間で良いことだ、単一の表現は、一般的には不可能です。表現、パフォーマンスや曖昧さの豊かさで妥協があります。
JSONはうまく残りの基準を満たしています。メッセージは、コンパクトであり、(XMLとは違って)素早く解析します。ネスティングがうまく処理されます。コードを壊すことなく、構造を変更することは、常にあやふやである - あなたが何かを削除する場合は、古いコードが解除されます。あなたが必要とした何かを変更した場合は、古いコードが解除されます。あなたは物事を追加する場合は、しかし、JSONはまた、これを処理します。
私は、人間が読める好きです。これは、デバッグとトラブルシューティングの多くの助けます。
Pythonのタプルはリストに入れたの機微は興味深い問題ではありません。受信アプリケーションが既に受信されている構造を知っているし、それを微調整することができます(それが重要ならば。)
<時間>パフォーマンスに編集します。
<のhref = "http://developers.de/blogs/damir_dobric/archive/2008/12/27/performance-comparison-soap-vs-json-wcf-implementation.aspxからXMLやJSON文書を解析"REL =" nofollowをさnoreferrer "> 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は、同じ内容のために大幅に高速であるように思われます。私は、Python 2.5.2でのPythonのsimplejsonとのElementTreeモジュールを使用します。
あなたは、このリンクに興味があるかもしれません
http://kbyanc.blogspot.com/2007/07 /python-serializer-benchmarks.htmlする
代替:MessagePackはそこ最速のシリアライザのようです。たぶん、あなたはそれを試してみることができます。
ヘッセは、要件のすべてを満たしています。 Pythonのライブラリがここにあります:
https://github.com/bgilmore/mustaineする
プロトコルの公式ドキュメントは、ここで見つけることができます:
私は定期的に、JavaとPythonの両方で使用します。それは作品と書き込みプロトコルの定義ファイルを必要としません。私は、Pythonのシリアライザを実行する方法を教えてくれませんでしたが、Javaのバージョンが合理的に効率的である。