2016-11-24 5 views
0

크기가 매우 큰 사전을 가지고 있는데 알고리즘에 자주 문의해야합니다. 빠른 결과를 얻으려면 가능한 한 메모리에 넣고 싶습니다. 다행스럽게도 500GB RAM이 있기 때문입니다.파이썬으로 메모리에로드 된 매우 큰 사전을 유지하는 방법은 무엇입니까?

그러나 내 주요 문제는 메모리에 한 번만로드 한 다음 다른 프로세스가 새 프로세스를 만들거나 코드를 반복 할 때마다 다시로드하지 않고 동일한 사전을 쿼리하도록하고 싶다는 것입니다.

스크립트 1 :

# Load dictionary in memory 
def load(data_dir): 
    dictionary = load_from_dir(data_dir) ... 

스크립트 2 :

# Connect to loaded dictionary (already put in memory by script 1) 
def use_dictionary(my_query): 
    query_loaded_dictionary(my_query) 

이를 달성하는 가장 좋은 방법은 무엇입니까

그래서, 나는 이런 식으로 뭔가를 원하십니까? 나는 나머지 API를 고려해 봤지만, REST 요청으로 넘어 가면 사전을 메모리에 넣음으로써 얻은 모든 속도가 저하 될지 궁금하다.

제안 사항?

+0

아마도 도움이 될만한 redis와 같은 것을 사용하십시오. –

+0

네, redis도 좋은 생각입니다. 파이썬에서이 작업을 수행 할 수있는 방법이 있는지 궁금합니다. 이전에 mongodb를 시도했지만 최신 wiredtiger 버전의 mongodb에는 메모리의 모든 데이터를 미리로드 할 수있는 옵션이 없습니다. 문제는 루트 암호가 없어서 너무 많은 소프트웨어를 설치하고 싶지 않다는 것입니다. 하지만 내가 다시 시도하자. –

+0

NOSQL 데이터베이스를 다시 만들려고하십니까? 왜 기존에 의존하지 않습니까? –

답변

1

앞서 언급 한 REST API를 사용하여 액세스하는 별도의 서비스를 실행하거나 메모리 내장 데이터베이스를 사용하십시오.

저는 개인적으로 Redis과 함께 매우 좋은 경험을했지만 많은 사람들이 있습니다 (Memcached도 인기가 있습니다). Redis는 Python과 Django에서 사용하기 쉬웠습니다.

두 솔루션 모두 데이터 직렬화가 가능하므로 성능이 떨어집니다. Redis를 목록과 같은 간단한 구조로 채울 수있는 방법이 있지만 시도하지는 않았습니다. 나는 숫자 배열을 포장하고 numpy로 직렬화했다. 결국 충분히 빠르다. 어쨌든 간단한 문자열 키 - 값 쌍을 사용하면 성능이 최적화되고 memcached가 더 좋습니다.