2010-05-31 8 views
3

큰 메모리를 필요로하는 큰 (= 거대한) 파이썬 사전이 필요한 경우에 부딪 혔습니다. 그러나 모든 값은 단일 유형 (long)입니다. 키와 마찬가지로 값에 대한 파이썬 (또는 numpy, 정말로 중요하지 않습니다) 배열을 사용할 수 있다고 생각했습니다. 필요한 배열을 실제로 키와 값 저장을 위해이 배열을 사용하는 객체로 포장하십시오 (in : x; out : d [x]).상수 값 형식의 파이썬 사전

인덱스 변환 개체 (input -> index, 1..n, 여기서 n은 다른 값 카운터)를 사용할 수 있으며 array [index]를 반환 할 수 있습니다. 합리적인 메모리 요구 사항과 같은 인덱싱 방법을 구현하는 방법에 대한 몇 가지 기술을 자세히 설명 할 수 있습니다. 그러나 데이터 구조 객체가 이미 존재하는지 (파이썬에서 또는 C/++에서 파이썬으로 래핑 됨), 모든 패키지에서 (콜렉션과 일부 Google 검색을 확인했는지) 궁금합니다.

모든 의견을 환영합니다. 감사합니다.

+0

목록이 아닌 튜플을 사용하는 것이 좋습니다. 파이썬에는 평범한 "배열"이 없지만 튜플은 삽입 공간을 예약하지 않으므로 확실히 메모리 효율이 좋습니다. 그러나 사전은 해시 테이블 때문에 여전히 메모리를 씹기 때문에 정렬 된 데이터 구조를 사용하고 이진 검색을 사용하여 원하는 키를 찾고 튜플의 인덱스에 매핑하는 것이 좋습니다. –

+0

일반 Python 구현에 대해 왜 생각하고 계십니까? 예를 들어 Tokyo Cabinet과 같이 인덱싱이 이미 구현 된 즉시 사용 가능한 키 - 값 저장소 솔루션을 찾아 볼 가치가 있습니까? – Vestel

답변

2

이러한 유형의 작업은 일반적인 데이터베이스 유형 액세스 (주어진 유형의 열에있는 많은 양의 데이터)입니다. 빠른 액세스를 위해 인덱싱 된 키가있는 간단한 테이블을 만들 수 있습니다. 나는 그것에 대해 경험이 없지만 표준 sqlite3 모듈을 확인하고 싶을 수도 있습니다.

시간이 지남에 따라 키가 변경되지 않으면 모든 데이터를 두 개의 Python 메모리 최적화 배열 (표준 array 모듈)에 저장할 수 있습니다. 배열 하나에는 정렬 된 키가 있고 다른 배열에는 해당 값이 들어 있습니다. 그런 다음 최적화 된 bisect.bisect 함수를 통해 키 색인을 찾을 수 있습니다.

+0

+1은 DB와 다른 Python 솔루션을 제안합니다. –

0

std :: map을 사용해 볼 수도 있습니다. Boost.Python은 out-of-the-box에서 std :: map을위한 파이썬 포장을 제공합니다.