В настоящее время я работаю с массивом двумерных numpy объектов, заполненных объектами collection.counter. Каждый счетчик - это, по сути, гистограмма.
- Ключи всегда из ограниченного набора целых чисел, например, от 0 до 1500
- количество элементов в каждом счетчике является переменным, большинство из них небольшие, но некоторые имеют каждый ключ
Все это прекрасно работает для моих потребностей с небольшими наборами данных, но с набором данных около 500 миллионов ячеекотметьте, что использование памяти составляет около 120 ГБ, что немного выше.
Интересно, что numpy.save записывает это в файл 4 ГБ, что заставляет меня думать, что есть что-то лучшее, что я могу сделать.
Любойпредложения о том, как я могу уменьшить использование памяти.
Я рассматривал трехмерный массив, но из-за количества пустых отсчетов он должен был бы содержать его, что потребовало еще больше памяти.
Я делаю многоиспользование counter.update при построении массива, поэтому любой метод нуждается в быстром / аккуратном способе получения аналогичной функциональности.
Доступ послеСоздание данных не является большой проблемой, поскольку для каждой ячейки я могу получить значение для каждого ключа - нет необходимости в индексации словарей.
Ниже приведен очень упрощенный пример, который создает небольшой набор данных, который приблизительно аналогиченк тому, что описано выше.Мой код будет иметь перекос в сторону уменьшения количества ключей на счетчик и более высоких значений на ключ
def counterArray_init(v):
return collections.Counter([v])
e = np.random.random_integers(0,1500,[10,10])
row_len, col_len = e.shape
counterArray = np.zeros([row_len,col_len], dtype= object)
vinit = np.vectorize(counterArray_init)
counterArray[:,:] = vinit(e)
for row in xrange(1,row_len):
for col in xrange(0,col_len):
counterArray[row,col].update(counterArray[row - 1,col])
return counterArray
Спасибо
Редактировать: я понял, что в моих меньших счетчиках используемые ключи находятся в пределах небольшогоспектр.Случайный пример кода выше не является хорошим примером такого поведения.В результате я исследую использование массива объектов, заполненного массивами int различной длины, и отдельного массива, в котором хранится минимальное значение ключа для каждого из этих массивов int.Это кажется странным решением, но первоначальное тестирование похоже на то, что оно использует только около 20% памяти, используемой методом счетчика.