2011-09-27 3 views
3

매우 공격적인 캐싱으로 웹 응용 프로그램을 만들고 있습니다. 거의 모든 웹 응용 프로그램 구성 요소 (보기, 부분보기, 컨트롤러 출력, 디스크로드, REST-API 호출, 데이터베이스 쿼리). 캐시 될 수있는 모든 것은 모든 레벨에서 데코레이터를 사용하여 캐시됩니다.파이썬 : 캐싱으로 인해 속도가 느려지지는 않습니다.

대다수의 HTML 세대가 디스크/REST API의로드가 거의없는 순수 함수로 이루어져 있기 때문에 당연한 일입니다. 또한 수행하는 디스크로드/데이터베이스 쿼리/REST API 쿼리는 무효화 될 때까지 캐싱됩니다. 이 변경되지 않으면 캐시도 매우 빠릅니다.

모든 것이 매우 빠르게되고 있지만, 문제가 있습니다.이 모든 것들은 WSGI 프로세스의 거대한 글로벌 사전에 메모리에 캐시되어있어 직렬화없이 직접 저장할 수 있습니다. memcached에 물건을 넣기 시작하면 캐시 히트에 걸리는 시간이 너무 많이 변하지는 않지만 캐시에 물건을 넣는 데 훨씬 오래 걸립니다. 일반적으로 괜찮습니다. 그러나 각 페이지의 초기 "채우기 캐시"생성은 ~ 900ms (디스크에서 읽는 플랫 파일의 수를 고려하면 이미 매우 빠름)에서 ~ 9000ms 정도입니다. 참고로 캐시가 예열되면 임의의 페이지를 생성하는 데 10ms가 걸립니다.

코드를 프로파일 링 할 때, 대부분의 시간은 cPickle로 진행됩니다. 질문은, 어떻게하면 더 빨리 만들 수 있을까요? 직렬화없이 객체를 직접 전달할 수있는 메모리 내 캐시가 있습니까? 또는 개체의 내 거대한 더미를 캐싱하도록하는 방법은? 영구 memcached없이 그냥 갈 수는 있지만, 그 다음에는 Apache/WSGI 프로세스 매니저의 처지에 내 성능 (또는 그 부족)이있을 것입니다.

+0

cPickle 프로토콜 2를 사용하고 있습니까?[marshal] (http://docs.python.org/library/marshal.html)을 사용해 보셨습니까? – jterrace

+0

나는 cPickle 프로토콜 2를 사용하고 있습니다. 마샬이 사용자 정의 클래스에서 작동하지 않는다고 생각 했습니까? –

답변

3

파이썬 객체와 간단하지 데이터 유형을 직렬화하는 경우, 그리고 피클을 사용하는이, cPickle.HIGHEST_PROTOCOL을 시도 :

my_serialized_object = cPickle.dumps(my_object, cPickle.HIGHEST_PROTOCOL) 

기본 프로토콜은 파이썬의 이전 버전과 호환됩니다,하지만 가능성이 돈 신경 쓰지 마.

방금 ​​1000 개 키로 간단한 벤치마킹을했는데 거의 한 단계 빨랐습니다.

업데이트 : 이미 가장 높은 프로토콜을 사용하고있는 것으로 보입니다. 성능을 높이려면 추가 작업을해야합니다. 여기에 내가이 시점에서 어떻게 할 것인지입니다 :

  • 가 빠른 직렬화 방법을 구현하는 클래스의 메소드 쌍을 작성 피클을

    1. 가 식별 가장 느린입니다 클래스라고 _TO_STRING()와 _from_string (s). 실제 직렬화는 객체가 포함하고있는 용도와 사용 방법에 맞게 조정할 수 있습니다. 예를 들어 일부 객체는 실제로 렌더링 된 템플릿과 같은 간단한 문자열 만 포함 할 수 있으며 일부는 JSON으로 브라우저에 실제로 전송 될 수 있습니다.이 경우 JSON에 직렬화하여 직접 제공 할 수 있습니다. 확인, 당신의 방법은 당신의 장식에서 실제로 빠른

    2. 있는지 확인하는 대신,이 방법은 당신이를 해결 할 수 있습니다

    있는 경우으로 hasattr (객체, '_TO_STRING') 사용을 timeit module를 사용하여 최악의 클래스를 먼저 사용하고 코드 기반을 최소한으로 분산시킵니다.

  • +0

    마샬은 훨씬 빠릅니다. – jterrace

    +0

    네이티브 형식 인 경우 네,하지만 개체를 ​​지원하지 않으며 OP는 개체를 캐싱하고 있음을 나타냅니다. –

    관련 문제