2014-02-19 2 views
5

나는 내 경우에 word-->document_id "역 색인"역할을하는 python dict의 메모리 소비를 줄이려고합니다. 각각 word은 24 바이트를 차지하는 정수로 해쉬됩니다.int 대신에 bitarray를 사용하여 dict의 메모리 절약?

각 요소를 dict의 값과 dict 내의 각 키를 비트 배열로 변환 할 수 있는지 궁금합니다. 난 어떤 최대 값이 int보다 작은 것으로 나타났습니다 2^22보다, 그래서 난 그냥 "크기 22"의 비트 배열을 할당 할 수 있습니다.

어떻게이 작업을 수행 할 수 있습니까? 지금까지 gmpy2bitarray 라이브러리, 그리고 Cython과 함께 사용할 수있는 C++ stdlib의 std::bitset을 보았습니다. 나는이 post에서 bitarraygmpy만큼 빠르지 않다는 것을 읽었습니다. gmpy에서 크기를 설정하는 방법을 모르겠습니다. 마지막으로 파이썬에서 gmpy 또는 bitarray 개체의 메모리 오버 헤드가 가치가 있는지 궁금합니다. std::bitset을 사용할 수 있습니다.

답변

3
>>> sys.getsizeof(1) 
24 

내 컴퓨터에서 바로 정수를 들어, 24 바이트 있다고. 파이썬 객체의 경우, 객체 오버 헤드는 그러한 작은 값에 대한 다른 모든 비용을 줄이려고합니다. 비록 당신이 10 비트를 깎을 수는 있지만 (메모리 할당은 그렇게 할 수 없다), 그것은 refcount, 타입 포인터, 그리고 dict 엔트리 자체에 비해 땅콩이다. 번호)를 입력해야합니다.

bitarray은 도움이 될 수 없습니다. 그것은 int보다 클 것입니다. std::bitset에 대해 모르겠다. 오버 헤드 Cython이 어떤 부분을 추가하는지 모르겠지만, 비트 수 같은 오버 헤드가있을 것이다. 어떤 것이 든, Cython int가 가장 잘 작동 할 것으로 기대하지만, 아마도 dict에 들어가기 위해서는 보통의 파이썬 int로 변환 될 필요가 있습니다.

+0

C 타입의'unsigned int '를 저장하기 위해'std :: unordered_map'을 사용할 수 있습니다. 그러나 당신은 bitarrays없이 그것을 구현하는 것이 더 낫다는 것을 말하고 있습니다 ..? – richizy

+0

@richizy : Bitarrays가 도움이되지 않습니다. 나는'unordered_map'이 당신의 가장 좋은 장면이라고 생각합니다. – user2357112

+0

괜찮습니다. 파이썬 기본 요소에 대한 메모리 참조가 얼마나 미친 것인지 알지 못했습니다. – richizy