2011-07-12 8 views
7

私は、小さくて複雑なprotobufでエンコードされたメッセージをたくさん処理する必要があるpythonプログラムを書いています。私は純粋なpythonで書かれたプロトコルバッファのPython実装を使用しようとしましたが、そのパフォーマンスは本当にひどいです。swigを使ってgoogleプロトコルバッファをバインドする

私は明らかに解決策を探していますsome folks got to work - protocを使ってC++ファイルを生成し、swigを使ってPythonでそれらをラップします。問題は、動作するPythonモジュールに到達できないことです。 に、-includeallとSWIGを実行している

  • 生成 メッセージクラスによって使用されるすべてのGoogleベース/ユーティリティクラスも包ま取得していることを確認 - 不足しているシステムに文句、SWIGは失敗したファイルが含まれる(例えば、「文字列」) 。 -Iフラグを指定したり、インクルードディレクトリ全体をコピーしたりして、この問題を回避することはできませんでした。環境はUbuntu 10.04、protobuf 2.2.0、swig 1.3.40、gcc 4.4.3です。

  • は、このフラグを指定しないと、私は私の メッセージクラス用のPythonモジュールを生成することができるよ、しかし、このモジュールは無用です:生成されたPythonの メッセージクラスは、Message ベースクラスによって提供されるすべての機能が欠けている - に特に、逆シリアル化メソッドのうちの1つを除いて、すべてが です。 (MergePartialFromCodedStream)の1つのメソッドは、入力 のCodedInputStream(これは のprotobufインフラストラクチャの一部)のストリームを必要とし、したがって をswigでラップしないため実行されません。

誰かがprotobuf-C++の上でうまく動くようになっている実例があるのだろうか?

また、同じページに記載されているPython拡張などの他の解決策の例がありますか?それは私の動的なスキーマのための高度なメンテナンスソリューションのようだが...

私はGroovyを好んでPythonを削除することを検討している - プロトコルバッファのJava実装がより効率的であると仮定している。それに関するコメント?

ムチャス・グラシアス!

答えて

0

生成されたヘッダーをSWIGファイルにインクルードしてください。また、includeallを使用するのではなく、明示的にベースクラスファイルをインクルードしてみてください。 SWIGは、基底クラスと派生クラスをバインドしたいと考えていることを十分に明示することができます。

+0

ありがとうございました... Greplinツール(https://github.com/Greplin)を使用してこれを最終的に整理しました。 –

1

ここで私が使用したGreplin fast-python-pbソリューションへの正しいリンクがあります。 (Linuxでは少なくとも)使いやすく、パフォーマンスはx100倍です。

このソフトウェアはまだ若く、少なくともGoogleの実装と互換性がありません。少なくともオプションのフィールドの空の値については違いますが、その違いはごくわずかです。

関連する問題