Я пытаюсь реализовать алгоритм на Cython. Но у меня не хватает памяти на моей BitSet
реализации. Я понятия не имею, почему, вот полезные снимки моего кода.
bitset.pyx
# distutils: language = c++
from libcpp.vector cimport vector
cdef class BitSet:
def __cinit__(self, int size):
self.vector = vector[bint](size)
cpdef void inter(self, BitSet other) except *:
# Do the intersection in place between two bitset
cpdef void add(self, int element):
if 0 <= element < self.vector.size():
self.vector[element] = True
bitset.pxd
# distutils: language = c++
from libcpp.vector cimport vector
cdef class BitSet:
cdef public vector[bint] vector
cpdef void inter(self, BitSet other) except *
cpdef void add(self, int element)
Мне нужно создать питона list
из BitSet
(около 12_000), каждый размером 1_000_000. Я бы сказал, что это должно занять 1_000_000 бит (для хранения типа bint) * 12000 = 1,5 ГБ
Но у меня очень быстро кончается память, вот картинка, чтобы объяснить больше
Самая низкая точка кривой составляет 1,5 ГБ, а самая высокая - 7 ГБ.
Я называю эту программу огромным списком, который может объяснить первый пик, второй, вероятно, тот, с которым я столкнулся.
Моей программе не хватает памяти только после 100_000 последовательностей.
Вот мой главный:
cdef class Main:
def __cinit__(self):
self.number_sequences # Int
self.foo = [] # python list type
def train(self, sequences):
self.number_sequences = len(sequences)
for id_seq, sequence in enumerate(sequences):
for element in sequence:
while not element < len(self.foo):
self.foo.append(BitSet(self.number_sequences))
self.foo[element].add(id_seq)
Моя оценка использования памяти неверна? А почему?
Как я могу отследить свою память? Я не нашел никаких инструментов для Cython.
Есть ли какое-нибудь решение, чтобы оно поместилось в памяти? (Замена BitSet набором целых чисел python работает, но он намного медленнее и должен занимать больше места)