2009-12-24 1 views
1

Apache/2.2.8 (Ubuntu) mod_python/3.3.1 Python/2.5.2를 사용하고 싶습니다. 함께 작업하는 데이터를 사전로드하십시오.서버가 실행되는 동안 diff 요청으로 읽기 전용 데이터에 액세스하는 방법 (Apache, mod_python)

현재 요청이있을 때마다 디스크의 파일에서 데이터를 읽은 다음이를 구문 분석하고 개체에 저장합니다. 데이터 파일은 비교적 크고 미리 파싱/미리로드하고 싶습니다.

아파치가 시작될 때 (서버가 실행되는 동안 ~ 100MB ~ 500MB의 데이터가 메모리에 상주 할 수 있음) 메모리에 데이터를로드 할 수 있거나 첫 번째 데이터 요청이있을 때 2)로드 할 수 있다고 생각했습니다. 제출하고 서버를 종료 할 때까지 메모리에 보관하십시오.

from mod_python import apache 
from mod_python import Session 

gvar = 0 

def handler(req): 
    req.content_type = 'text/plain' 

    session = Session.Session(req) 
    if session.is_new(): 
     global gvar 
     req.write('gvar was originally : '+str(gvar)) 
     gvar = 314 
     session['addr'] = req.connection.remote_ip 
     session.save() 
     req.write('\ngvar was just set to: '+str(gvar)) 
    else: 
     global gvar 
     req.write('gvar set to: '+str(gvar)) 

    return apache.OK 

출력 (세션 하나) :
gvar 원래 하였다 : 0 gvar 단지로 하였다
: 314

출력 (세션 아래

번째 아이디어 가입 모의이고 > 1) :
gvar : 314

의견과 해결책을 보내주십시오. thx

+0

Python에서 지연 인스턴스화를 살펴보십시오. http://en.wikipedia.org/wiki/Lazy_initialization#Python –

+0

지연 초기화를위한 프로그래밍 패턴 또는 대량의 데이터를 사전 캐싱하는 메커니즘에 대한 질문이 있습니까? , 아니면 둘다? –

+0

파이썬에서 싱글 톤 패턴을 사용하는 멀티 스레드 게으른 인스턴스 생성을 원할 수도 있습니다. http://en.wikipedia.org/wiki/Singleton_pattern#Python 다른 요청이 별도의 스레드로 실행되고 있습니까? –

답변

1

데이터와 함께 tmpfs (또는 ramfs) 마운트를 설정할 수 있으며 RAM에 남아 있습니다 (tmpfs가 데이터를 스왑으로 보낼 수 있음).

0

데이터가 어떤 형식인지는 알 수 없지만 키 스토어로 충분하면 OS 캐싱과 함께 shelve를 사용하여 데이터를 미리 준비된 형식으로 유지할 수 있습니다.

+0

내 데이터는 텍스트 형식입니다. –

+0

디스크에서 데이터를 읽을 때 많은 시간을 절약 할 수 있기 때문에 직렬화를 피하고 싶습니다. (데이터 obj와 관련된 메타 정보가 많이 있습니다.). "OS 캐싱과 함께"당신이 의미하는 바를 명확히 할 수 있습니까? –

+0

shelve는 디스크에 저장된 키 저장소를 사용하므로 디스크 캐시에 관련 부분을 보관하는 것은 OS에 달려 있습니다. –

0

또 다른 옵션은 posix_ipc을 사용하여 모든 프로세스에서 사용할 수있는 공유 메모리에 데이터를 보관하는 것입니다.