25

私の Python アプリケーションは現在、python-memcached APIを使用して memcached 内のオブジェクトを設定および取得しています。この API は、Python のネイティブpickle モジュールを使用して、Python オブジェクトをシリアライズおよびデシリアライズします。

この API を使用すると、ネストされた Python リスト、辞書、およびタプルを memcached に簡単かつ迅速に格納できます。これらのオブジェクトをアプリケーションに読み込むことは完全に透過的であり、機能します。

しかし、私は Python だけを使用することに限定したくありません。また、すべての memcached オブジェクトが pickle でシリアル化されている場合、他の言語で記述されたクライアントは機能しません。

私が検討したクロスプラットフォームのシリアル化オプションは次のとおりです。

  1. XML - 主な利点は人間が判読できることですが、このアプリケーションではそれは重要ではありません。XML も多くのスペースを必要とし、解析にはコストがかかります。

  2. JSON - 優れたクロスプラットフォームの標準のように思えますが、memcached から読み戻されたときにオブジェクト タイプの特性が維持されるかどうかはわかりません。たとえば、この投稿によると、タプルはsimplejsonを使用するとリストに変換されます。また、JSON 構造に要素を追加すると、古い構造に記述されたコードが壊れる可能性があるようです

  3. Google Protocol Buffers - 非常に高速でコンパクトに見えるため、これに非常に興味があります。少なくとも XML よりも 10 倍小さく高速です。人間が読める形式ではありませんが、このアプリにとっては重要ではありません。古いコードを壊さずに構造の成長をサポートするように設計されているようです

このアプリの優先順位を考えると、memcached の理想的なオブジェクトのシリアル化方法は何ですか?

  1. クロスプラットフォームのサポート (Python、Java、C#、C++、Ruby、Perl)

  2. ネストされたデータ構造の処理

  3. 高速シリアライゼーション/デシリアライゼーション

  4. 最小メモリフットプリント

  5. 古いコードを壊さずに構造を変更できる柔軟性
4

5 に答える 5

7

主な考慮事項の 1 つは、「各構造定義を指定する必要があるか」ということです。

それでよろしければ、以下をご覧ください。

  1. プロトコル バッファ - http://code.google.com/apis/protocolbuffers/docs/overview.html
  2. Thrift - http://developers.facebook.com/thrift/ (よりサービス向け)

これらのソリューションは両方とも、各データ構造を定義するためのサポート ファイルを必要とします。


各構造を事前に定義するという開発者のオーバーヘッドを発生させたくない場合は、以下をご覧ください。

  1. JSON (python cjson およびネイティブ PHP json 経由)。バイナリ コンテンツ (画像など) を送信する必要がない場合、どちらも非常に高速です。
  2. まだ別のマークアップ言語 @ http://www.yaml.org/。また、適切なライブラリを取得すれば、非常に高速です。

ただし、これらはどちらもバイナリ コンテンツの転送に問題があると思われるため、使用から除外されました。 注: YAML には優れたバイナリ サポートがある場合があります。クライアント ライブラリを確認する必要があります -- ここを参照してください: http://yaml.org/type/binary.html


弊社ではバイナリ対応のクロスランゲージシリアライゼーション用の独自ライブラリ(Extruct)を展開しました。現在、Python と PHP で (かなり) 高速な実装を行っていますが、すべての文字列で base64 を使用しているため (バイナリ サポート)、人間が読めるものではありません。最終的にはそれらを C に移植し、より標準的なエンコーディングを使用します。

PHP や Python などの動的言語は、ループ内の繰り返しが多すぎる場合や、各文字を確認する必要がある場合、非常に遅くなります。一方、Cはそのような操作に優れています。

Extruct の実装を見たい場合は、お知らせください。(連絡先はhttp://blog.gahooa.com/の「自己紹介」にあります)

于 2009-02-19T06:14:44.950 に答える
6

いくつかの方法を試した結果、速度とメモリ フットプリントの最適なバランスとして、圧縮された JSON に落ち着きました。Python のネイティブ Pickle 関数はわずかに高速ですが、結果のオブジェクトは Python 以外のクライアントでは使用できません。

3:1 の圧縮が見られるため、すべてのデータが memcache に収まり、アプリはページ レンダリングを含めて 10 ミリ秒未満の応答時間を取得します。

以下は、JSON、Thrift、Protocol Buffers、および YAML を圧縮ありとなしで比較したものです。

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

このテストでは、圧縮された JSON で行ったのと同じ結果が得られたようです。各構造を事前に定義する必要がないため、これがクロスプラットフォームの最速かつ最小の答えのようです。

于 2009-03-01T20:47:27.830 に答える
3

「クロスプラットフォームのサポート (Python、Java、C#、C++、Ruby、Perl)」

残念ながら、この基準が最初です。ほとんどの言語の背後にある意図は、基本的なデータ構造と処理を異なる方法で表現することです。それが複数の言語を「問題」にする理由です。それらはすべて異なります。

多くの言語で有効な単一の表現は一般的に不可能です。表現の豊かさ、パフォーマンス、またはあいまいさには妥協があります。

JSON は残りの基準をうまく満たしています。メッセージはコンパクトで、すばやく解析できます (XML とは異なります)。ネスティングはうまく処理されます。コードを壊さずに構造を変更することは、常に不安定です。何かを削除すると、古いコードが壊れてしまいます。必要なものを変更すると、古いコードが壊れます。ただし、何かを追加する場合は、JSON もこれを処理します。

私は人間が読めるのが好きです。多くのデバッグとトラブルシューティングに役立ちます。

Python のタプルをリストに変換する微妙な問題は、興味深い問題ではありません。受信側のアプリケーションは、受信される構造を既に認識しており、それを微調整できます (重要な場合)。


パフォーマンスを編集します。

http://developers.de/blogs/damir_dobric/archive/2008/12/27/performance-comparison-soap-vs-json-wcf-implementation.aspxからの XML および JSON ドキュメントの解析

xmlParse 0.326 jsonParse 0.255

JSON は、同じコンテンツに対して大幅に高速であるように見えます。Python 2.5.2 で Python SimpleJSON および ElementTree モジュールを使用しました。

于 2009-01-31T22:13:41.403 に答える
2

このリンクに興味があるかもしれません:

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

別の方法: MessagePack は、最速のシリアライザーのようです。多分あなたはそれを試してみることができます。

于 2010-09-16T02:07:53.423 に答える
1

Hessian は、すべての要件を満たしています。ここにpythonライブラリがあります:

https://github.com/bgilmore/mustaine

プロトコルの公式ドキュメントは次の場所にあります。

http://hessian.caucho.com/

私はJavaとPythonの両方で定期的に使用しています。動作し、プロトコル定義ファイルを作成する必要はありません。Python シリアライザーがどのように機能するかはわかりませんが、Java バージョンはかなり効率的です。

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

于 2012-02-16T21:25:25.093 に答える