Я пытаюсь уменьшить потребление памяти Python dict, который в моем случае служит word-->document_id
«перевернутый индекс». каждый word
хешируется как целое число, которое занимает 24 байта.
Мне было интересно, могу ли я преобразовать каждый элемент в dict
и каждый ключ в пределах dict
вместо битрейра. Я заметил, что максимальное значение любого встреченного int
меньше чем 2^22
Так что я могу просто выделить битовый массив размером 22.
Как это может быть сделано? До сих пор я видел gmpy2
а также bitarray
библиотеки, а также std::bitset
в C ++ stdlib, который я могу использовать с Cython. Я прочитал из этого сообщение тот bitarray
не так быстро, как gmpy
, В gmpy
Я не уверен, как установить размер. Наконец, мне интересно, gmpy
или же bitarray
объекты в Python стоят того, когда я могу просто использовать std::bitset
, который, вероятно, использует меньше всего памяти.
>>> sys.getsizeof(1)
24
Это 24 байта, только для целого числа, на моей машине. Для объектов Python накладные расходы на объекты сократят все другие затраты для таких малых значений. Даже если бы вы могли сбрить 10 бит (что не может; выделение памяти не работает таким образом), это арахис по сравнению с refcount, указателем типа и самой записью dict (которая не включена в эти 24 номер), даже прежде чем вы получите к фактическим данным.
bitarray
не собирается помогать; это, вероятно, больше, чем int. Я не знаю о std::bitset
, так как я не уверен, что Cython добавляет к нему служебную информацию, но он будет иметь издержки для таких вещей, как подсчет битов. Во всяком случае, я ожидал бы, что Cython int будет работать лучше, но, вероятно, его нужно преобразовать в обычный Python int, чтобы вступить в противоречие.
Других решений пока нет …