2013-08-16 3 views
1

메인 애플 리케이션 API에 자연 언어 처리 지원을 제공하는 파이썬 기반 웹 서비스를 구축 중이다. NLP가 너무 무거 우므로 디스크에서 몇 개의 매우 큰 (50-300MB) 코퍼스 파일을 unpickling해야 모든 종류의 분석을 수행 할 수 있습니다.파이썬 Flask/Gevent 웹 서비스에서 대형 객체 캐싱

이러한 파일을 모든 요청에 ​​사용할 수 있도록 메모리에로드하려면 어떻게해야합니까? memcached와 redis로 실험했지만 훨씬 작은 객체를 위해 설계된 것 같습니다. Flask g 개체를 사용하려고했지만 한 요청을 통해서만 지속됩니다.

동시 연결을 허용하기 위해 gevent (또는 다른) 서버를 사용하는 동안이 작업을 수행 할 수있는 방법이 있습니까? 이 코퍼스는 완전히 읽기 전용이므로 여러 개의 greenlets/threads/프로세스에 메모리를 노출시키는 안전한 방법이되어야합니다.

어리석은 질문이라면 정말 고마워요. 파이썬으로 꽤 오랫동안 일해 왔지만, 웹 프로그래밍에 비교적 익숙하지 않습니다.

+0

IMO 대신 피클 이외의 다른 저장 형식을 사용해야합니다. 어때요 ... 데이터베이스? –

+0

@ MarkusUnterwaditzer 예, 끝났습니다. NLP의 어려움은 대부분의 작업에서 일반적으로 일종의 특수화 된 데이터 구조로 메모리에로드 된 전체 자료가 필요하다는 것입니다. 특정 작업에 대해서만 코퍼스가 필요한 경우가 있습니다 (예 : 끝난 것처럼)이 문제를 해결할 수도 있지만 일반적인 경우를 지원하는 데이터 저장소를 알지 못합니다. – sbrother

답변

1

Gevent를 사용하는 경우 프로세스의 전체 범위에서 읽기 전용 데이터 구조를 가질 수 있으며 모든 Greenlets가이를 공유합니다. Gevent를 사용하면 서버가 단일 프로세스에 포함되므로 데이터를 한 번로드하고 모든 작업자 환경에서 공유 할 수 있습니다.

데이터에 대한 액세스를 캡슐화하는 좋은 방법은 액세스 함수 또는 클래스를 모듈에 넣는 것입니다. 모듈을 가져올 때 데이터를 unpicliking 할 수 있으며, 누군가가 모듈에 함수를 처음 호출 할 때이 작업을 트리거 할 수 있습니다.

경쟁 조건이 발생할 가능성은 없지만 데이터가 엄격하게 읽기 전용이면 괜찮을 것입니다.

+0

고마워,이게 내가 찾고 있던거야. 사용할 수있는 전역 네임 스페이스가 있다는 것을 깨닫지 못했습니다. 그러나, 코퍼스 파일을 훨씬 더 소화 가능한 덩어리로 분할하는 방법을 찾은 후에 redis와 Flask-Cache로 끝났습니다. 그것은 매우 빠르며, 가동 중단없이 코퍼스를 업데이트 할 수 있습니다. – sbrother

0

서버가 인스턴스화 될 때 파일을 언 클럭핑 할 수 없으며 전역 이름 공간에 언 피클 링 된 데이터를 유지할 수 있습니까? 이렇게하면 각 요청에 대해 사용할 수있게되며, 아무 것도 쓸 계획이 없으므로 어떠한 경쟁 조건도 두려워 할 필요가 없습니다.