массив гистограмм - PullRequest
       3

массив гистограмм

1 голос
/ 07 марта 2012

В настоящее время я работаю с массивом двумерных 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% памяти, используемой методом счетчика.

Ответы [ 3 ]

1 голос
/ 08 марта 2012

Я бы определенно использовал трехмерный массив, так как ключи являются целыми числами.Какое максимальное количество для конкретного предмета?Если оно меньше 255, вы также можете изменить тип данных массива на 8 бит.

1 голос
/ 08 марта 2012

Если имеется много пустых отсчетов, то представление с разреженной матрицей может хорошо подойти, когда использование памяти пропорционально количеству непустых элементов в массиве. SciPy имеет достойную поддержку того, на что вы смотрите: scipy.sparse

0 голосов
/ 08 марта 2012

Быстрый тест показывает, что хранение кортежей вместо Counter объектов сэкономит вам только около 20%. (может стоить двойной проверки в вашем случае использования). И если хранение в виде простого массива int еще менее эффективно, то есть несколько других вариантов.

Разреженные массивы являются хорошим средством экономии пространства, но не предлагают такой же boadcasting, как обычный массив, они обычно просто используются для создания или хранения данных, а затем преобразуются в обычные массивы для вычислений. Если вы обходите свои индикаторы с помощью регулярных петель Python, то разреженные массивы могут быть хорошим решением.

numpy.save должно быть какое-то сжатие. Сжатие, которое вряд ли будет полезным для данных, которые активно используются в памяти. Вы используете pyTables или h5py ? Как вы в настоящее время управляете 120G данных - Виртуальная память?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...