문제

내 파이썬 응용 프로그램은 현재 사용합니다 파이썬-모임 API Memcached에서 객체를 설정하고 가져옵니다. 이 API는 Python의 네이티브를 사용합니다 피클 모듈 파이썬 객체를 직렬화하고 해제하기 위해.

이 API는 중첩 된 파이썬 목록, 사전 및 튜플을 멤버에 저장하는 것이 간단하고 빠르며,이 객체를 응용 프로그램으로 다시 읽는 것은 완전히 투명합니다.

그러나 나는 Python을 독점적으로 사용하는 것으로 제한되기를 원하지 않으며, 모든 Memcached 객체가 피클로 직렬화되면 다른 언어로 작성된 클라이언트는 작동하지 않습니다.

내가 고려한 크로스 플랫폼 직렬화 옵션은 다음과 같습니다.

  1. XML- 주요 이점은 인간이 읽을 수 있지만이 응용 프로그램에서는 중요하지 않다는 것입니다. XML은 또한 많은 공간을 차지하며 구문 분석 비용이 많이 듭니다.

  2. JSON- 좋은 크로스 플랫폼 표준처럼 보이지만 Memcached에서 다시 읽을 때 객체 유형의 특성을 유지하는지 확신 할 수 없습니다. 예를 들어,에 따르면 이 게시물 튜플은 사용할 때 목록으로 변환됩니다 Simplejson; 또한 JSON 구조에 요소를 추가하면 이전 구조에 작성된 코드를 깨뜨릴 수 있습니다.

  3. Google 프로토콜 버퍼 - 나는 매우 빠르고 컴팩트 한 것처럼 보이기 때문에 XML보다 적어도 10 배 작고 빠릅니다. 인간이 읽을 수는 없지만이 앱에는 중요하지 않습니다. 그리고 그것은 오래된 코드를 깨지 않고 구조를 성장시키는 것을 지원하도록 설계된 것 같습니다.

이 앱의 우선 순위를 고려하면 Memcached의 이상적인 객체 직렬화 방법은 무엇입니까?

  1. 크로스 플랫폼 지원 (Python, Java, C#, C ++, Ruby, Perl)

  2. 중첩 된 데이터 구조 처리

  3. 빠른 직렬화/해제

  4. 최소 메모리 발자국

  5. 오래된 코드를 깨지 않고 구조를 변경하는 유연성
도움이 되었습니까?

해결책 2

나는 몇 가지 방법을 시도하고 속도와 메모리 풋 프린트 사이의 최상의 균형으로 압축 JSON에 정착했습니다. Python의 기본 피클 기능은 약간 더 빠르지 만 결과 객체는 비 파이썬 클라이언트와 함께 사용할 수 없습니다.

3 : 1 압축을보고 있으므로 모든 데이터가 Memcache에 적합하고 앱은 페이지 렌더링을 포함하여 10ms 이하의 응답 시간을 얻습니다.

다음은 압축 유무에 관계없이 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
  2. 중고품 -http://developers.facebook.com/thrift/ (서비스를 향한 더 많은 장착)

이 두 솔루션 모두 각 데이터 구조를 정의하기 위해 지원 파일이 필요합니다.


각 구조를 사전 정의하는 개발자 간접비를 원하지 않으려면 다음을 살펴보십시오.

  1. JSON (Python CJSON 및 기본 PHP JSON을 통해). 이진 컨텐츠 (예 : 이미지 등)를 전송할 필요가 없다면 둘 다 정말 빠릅니다.
  2. 또 다른 마크 업 언어 @ http://www.yaml.org/. 당신이 올바른 라이브러리를 얻으면 정말 빠릅니다.

그러나 나는이 두 가지 모두 이진 함량을 전송하는 데 문제가 있었기 때문에 우리의 사용을 위해 배제 된 이유입니다. 메모: YAML은 이진 지원이 양호 할 수 있습니다. 클라이언트 라이브러리를 확인해야합니다. 여기를 참조하십시오. http://yaml.org/type/binary.html


우리 회사에서 우리는 이진지지를 갖춘 언어 교차 직렬화를 위해 우리 자신의 도서관 (추출)을 출시했습니다. 우리는 현재 Python 및 PHP에서 빠른 구현을 보유하고 있지만 모든 문자열에서 Base64를 사용하여 인간 읽을 수는 없습니다 (이진지지). 결국 우리는 그것들을 c로 포트하고 더 많은 표준 인코딩을 사용할 것입니다.

PHP 및 Python과 같은 동적 언어는 루프에 너무 많은 반복이 있거나 각 문자를보아야한다면 실제로 느리게됩니다. 반면에 C는 그러한 작업에서 빛을 발합니다.

추출 구현을보고 싶다면 알려주십시오. (연락처 정보 http://blog.gahooa.com/ "나에 대해") 아래))

"크로스 플랫폼 지원 (Python, Java, C#, C ++, Ruby, Perl)"

이 기준이 너무 나쁘다. 대부분의 언어의 의도는 기본 데이터 구조를 표현하고 다르게 처리하는 것입니다. 그것이 여러 언어를 "문제"로 만드는 것입니다. 모두 다릅니다.

많은 언어에서 좋은 단일 표현은 일반적으로 불가능합니다. 표현, 성능 또는 모호성의 풍부함이 타협합니다.

JSON은 나머지 기준을 멋지게 만납니다. 메시지는 XML과 달리 작고 빠르게 구문 분석됩니다. 중첩은 잘 처리됩니다. 코드를 깨지 않고 구조를 변경하는 것은 항상 iffy입니다. 무언가를 제거하면 오래된 코드가 깨질 것입니다. 필요한 것을 변경하면 오래된 코드가 중단됩니다. 그러나 물건을 추가하는 경우 JSON 도이 문제를 처리합니다.

나는 인간이 읽을 수있는 것을 좋아합니다. 많은 디버깅과 문제가 해결되는 데 도움이됩니다.

파이썬 튜플을 목록으로 바꾸는 미묘함은 흥미로운 문제가 아닙니다. 수신 응용 프로그램은 이미 수신 된 구조를 알고 있으며, 그 구조를 조정할 수 있습니다 (중요하다면).


성능 편집.

XML 및 JSON 문서를 구문 분석합니다 http://developers.de/blogs/damir_dobric/archive/2008/12/27/performance-comparison-soap-vs-json-wcf-impletation.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은 가장 빠른 시리얼 라이저 인 것 같습니다. 어쩌면 시도해 볼 수 있습니다.

Hessian은 귀하의 모든 요구 사항을 충족합니다. 여기에는 파이썬 라이브러리가 있습니다.

https://github.com/bgilmore/mustaine

프로토콜에 대한 공식 문서는 여기에서 찾을 수 있습니다.

http://hessian.caucho.com/

나는 정기적으로 Java와 Python에서 그것을 사용합니다. 작동하며 프로토콜 정의 파일을 작성하지 않아도됩니다. Python Serializer의 작동 방식을 말할 수 없었지만 Java 버전은 합리적으로 효율적입니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top