2011-07-12 33 views
7

Tôi đang viết chương trình python cần xử lý rất nhiều tin nhắn được mã hóa protobuf nhỏ nhưng phức tạp. Tôi đã cố gắng sử dụng Python thực hiện các bộ đệm giao thức, được viết bằng python tinh khiết, nhưng hiệu suất của nó thực sự là khủng khiếp.sử dụng swig để liên kết bộ đệm giao thức google

Vì vậy, tôi đang xem xét một giải pháp rõ ràng là some folks got to work - sử dụng protoc để tạo tệp C++, sau đó sử dụng swig để quấn chúng bằng python. Vấn đề là tôi không thể đến một mô-đun Python đang hoạt động.

  • Khi chạy róc rách với -includeall, để đảm bảo rằng tất cả các lớp cơ sở/tiện ích của Google được sử dụng bởi lớp thông điệp được tạo ra cũng được bọc - uống một lân thất bại, phàn nàn về hệ thống thiếu bao gồm các file (ví dụ: "chuỗi") . Tôi không thể làm việc xung quanh điều này với -I cờ hoặc sao chép toàn bộ bao gồm các thư mục. Môi trường là Ubuntu 10.04, protobuf 2.2.0, swig 1.3.40, gcc 4.4.3.

  • Nếu không có lá cờ này, tôi có thể tạo ra một mô-đun python cho các lớp nhắn của tôi, nhưng mô-đun này là vô ích: Python lớp thông điệp được tạo ra đang thiếu tất cả các chức năng được cung cấp bởi các lớp cơ sở tin - trong cụ thể tất cả trừ một trong số các phương pháp de-serialization. Một phương thức còn lại (MergePartialFromCodedStream) sẽ không chạy, vì nó yêu cầu đầu vào luồng loại CodedInputStream (là một phần của cơ sở hạ tầng protobuf và do đó không được gói với swig).

Tôi đã tự hỏi liệu có ai có ví dụ làm việc để chuyển sang làm việc trên đầu trang của protobuf-C++ không?

Cách khác - có ví dụ về một số giải pháp khác, chẳng hạn như phần mở rộng Python được đề cập trong cùng một trang không? Mặc dù điều đó có vẻ giống như một giải pháp bảo trì cao cho sơ đồ động của tôi ...

Nếu không có điều nào trong số này hoạt động, tôi đang xem xét việc thả python có lợi cho Groovy - giả sử rằng việc triển khai bộ đệm giao thức Java sẽ hiệu quả hơn. Bất kỳ bình luận về điều đó?

Muchas Gracias!

Trả lời

0

Hãy thử% include'ing các tiêu đề được tạo trong tệp SWIG của bạn và cũng là các tệp lớp cơ sở một cách rõ ràng (thay vì sử dụng includeall). Bạn sẽ có thể đủ rõ ràng rằng SWIG hiểu rằng bạn muốn ràng buộc các lớp cơ sở và các lớp cơ sở.

+0

Cảm ơn John ... Cuối cùng tôi đã được sắp xếp này bằng cách sử dụng công cụ Greplin (https://github.com/Greplin) - rất khuyến khích! –

1

Đây là liên kết chính xác đến giải pháp Greplin fast-python-pb mà tôi đã sử dụng. Nó rất dễ sử dụng (ít nhất là trong Linux), và hiệu suất là x100 lần lên.

Phần mềm này vẫn còn trẻ và không tương thích 100% với việc triển khai Google, ít nhất là liên quan đến giá trị trống trong các trường tùy chọn - nhưng sự khác biệt là khá nhỏ.

Các vấn đề liên quan