매우 공격적인 캐싱으로 웹 응용 프로그램을 만들고 있습니다. 거의 모든 웹 응용 프로그램 구성 요소 (보기, 부분보기, 컨트롤러 출력, 디스크로드, REST-API 호출, 데이터베이스 쿼리). 캐시 될 수있는 모든 것은 모든 레벨에서 데코레이터를 사용하여 캐시됩니다.파이썬 : 캐싱으로 인해 속도가 느려지지는 않습니다.
대다수의 HTML 세대가 디스크/REST API의로드가 거의없는 순수 함수로 이루어져 있기 때문에 당연한 일입니다. 또한 수행하는 디스크로드/데이터베이스 쿼리/REST API 쿼리는 무효화 될 때까지 캐싱됩니다. 이 변경되지 않으면 캐시도 매우 빠릅니다.
모든 것이 매우 빠르게되고 있지만, 문제가 있습니다.이 모든 것들은 WSGI 프로세스의 거대한 글로벌 사전에 메모리에 캐시되어있어 직렬화없이 직접 저장할 수 있습니다. memcached에 물건을 넣기 시작하면 캐시 히트에 걸리는 시간이 너무 많이 변하지는 않지만 캐시에 물건을 넣는 데 훨씬 오래 걸립니다. 일반적으로 괜찮습니다. 그러나 각 페이지의 초기 "채우기 캐시"생성은 ~ 900ms (디스크에서 읽는 플랫 파일의 수를 고려하면 이미 매우 빠름)에서 ~ 9000ms 정도입니다. 참고로 캐시가 예열되면 임의의 페이지를 생성하는 데 10ms가 걸립니다.
코드를 프로파일 링 할 때, 대부분의 시간은 cPickle로 진행됩니다. 질문은, 어떻게하면 더 빨리 만들 수 있을까요? 직렬화없이 객체를 직접 전달할 수있는 메모리 내 캐시가 있습니까? 또는 개체의 내 거대한 더미를 캐싱하도록하는 방법은? 영구 memcached없이 그냥 갈 수는 있지만, 그 다음에는 Apache/WSGI 프로세스 매니저의 처지에 내 성능 (또는 그 부족)이있을 것입니다.
cPickle 프로토콜 2를 사용하고 있습니까?[marshal] (http://docs.python.org/library/marshal.html)을 사용해 보셨습니까? – jterrace
나는 cPickle 프로토콜 2를 사용하고 있습니다. 마샬이 사용자 정의 클래스에서 작동하지 않는다고 생각 했습니까? –