2012-03-21 2 views
5

임시 메모리 내장 키 - 값 저장소와 같은 것이 필요합니다. 레디 스 (Redis)와 같은 해결책이 있다는 것을 압니다. 하지만 파이썬 사전을 사용할 수 있을까요? 잠재적으로 더욱 빨라질 수 있습니까? 토네이도 (또는 비슷한) 서버가 실행 중이고 파이썬 사전을 메모리에두고 HTTP 요청에 따라 적절한 값을 반환한다고 생각하십시오.파이썬 사전을 임시 메모리 내장 키 - 값 데이터베이스로 사용 하시겠습니까?

왜 내가 이것을 필요로합니까? 서비스의 일부로 키 값이 저장되지만이 속성이 있습니다. 액세스가 더 최근의 것이 더 최근입니다. 그래서 빠른 검색을 위해 메모리에 마지막 100 개의 키 값 (디스크에 쓰는 것뿐만 아니라)을 계속 말하고 싶습니다.

서버가 죽으면 사전을 디스크에서 다시 복원 할 수 있습니다.

누구나 이런 식으로 일 했습니까? 내가 여기서 뭔가를 놓치고 있니?

추신 : 나는 WSGI 서버로는 불가능하다고 생각합니다. 맞습니까? 왜냐하면 내가 아는 한 당신은 개별 요청 사이에 어떤 것을 기억할 수 없기 때문입니다.

답변

4

저는 memcached와 함께 일하고 싶습니다. 이 설정되면 내 예에서 수행 것처럼 당신은 쉽게 기능/방법을 장식 할 수 있습니다 최적화의 종류 당신의 시간 낭비가 될 것이기 때문에

#!/usr/bin/env python 

import time 
import memcache 
import hashlib 

def memoize(f): 

    def newfn(*args, **kwargs): 
     mc = memcache.Client(['127.0.0.1:11211'], debug=0) 
     # generate md5 out of args and function 
     m = hashlib.md5() 
     margs = [x.__repr__() for x in args] 
     mkwargs = [x.__repr__() for x in kwargs.values()] 
     map(m.update, margs + mkwargs) 
     m.update(f.__name__) 
     m.update(f.__class__.__name__) 
     key = m.hexdigest() 

     value = mc.get(key) 
     if value: 
      return value 
     else: 
      value = f(*args, **kwargs) 
      mc.set(key, value, 60) 
      return value 
     return f(*args) 

    return newfn 

@memoize 
def expensive_function(x): 
    time.sleep(5) 
    return x 

if __name__ == '__main__': 
    print expensive_function('abc') 
    print expensive_function('abc') 

는 네트워크 대기 시간에 대해 걱정하지 마십시오.

0

실제 서비스를 실행하는 서버와 동일한 서버에 사전을 묶는 경우 그렇습니다. 그러면 제대로 작동합니다. 별도의 일을 만드는 경우


는, 음,이 memcached가 무엇인지 기본적이다. Don't reinvent the wheel.

0

네트워크 대기 시간이 없기 때문에 가능하며 redis/memcache보다 훨씬 빠릅니다. cPickle을 사용하여 한 번씩 사전을 덤프 할 수 있습니다. 프로그램이 하위 프로세스를 생성하고 한 프로세스에서 값을 업데이트해도 다른 프로세스에 영향을주지는 않지만 까다로운 일입니다.

+0

OP가 dorn에 요청을 중개하는 토네이도 서버를 말하면 ... 여전히 네트워크 대기 시간이 있습니다. – Amber

+0

@amber이지만 memcache/redis에는 적용되지 않습니다. –

+0

OP는 토네이도를 통해 * memcache/redis를 다시 구현한다고 제안하는 것으로 보입니다. – Amber

0
  1. 당신은 DICT에, 아무도 그것에 대해 단지 캐시 마지막 데이터를 금지 없었다 그것은 하나의 서버 환경에서 작동
  2. 새로운 데이터를 추가 할 때 - 일부 레디 스 (memcachedb)
  3. 서버가 재시작에 저장 - 최신 N 레코드를 사전에로드하십시오.

모두 데이터 볼륨에 따라 다릅니다. 사전에 복잡한 구조를 파이썬으로 유지하는 데 더 많은 메모리가 필요하다고 생각하면 액세스가 빠르게 될 것입니다 - 예

2

프로세스 파이썬 사전은 memcached 서버보다 더 빠른 방법입니다. 며칠 전에 수행 한 비 엄격한 벤치 마크에 따르면 단일 프로세스는 프로세스 파이썬 사전을 사용하여 약 2 초가 걸리고 localhost에서 수신 대기중인 memcached 서버를 사용하여 약 50 초가 걸립니다. 내 벤치 마크에서, 저는 C 클라이언트로 libmemcached를 사용하고 있었고 python-libmemcached는이 C 클라이언트를 통해 파이썬 래퍼로 사용했습니다.

1

나는 비슷한 것을 실험하고 있으며, corecache 라이브러리는 몇 가지 캐싱 시스템을 테스트 할 수있는 좋은 방법입니다.특히 https://pypi.python.org/pypi/cachecore

는 자신의 SimpleCache 구현은 바닐라 파이썬 딕셔너리에 의존, 나의 예비 시험에서 로컬 memcached를 호출하는 것보다 10 배 빠른 (I 아마, 캐싱을 필요로하는 파이썬 응용 프로그램에서 이미있어 가정, 매우 빨리 귀하의 경우에 토네이도 서비스).

관련 문제