Постепенное построение массива numpy и измерение использования памяти - PullRequest
11 голосов
/ 07 октября 2009

У меня есть серия больших текстовых файлов (до 1 гига), которые выводятся в результате эксперимента, который необходимо проанализировать в Python. Лучше всего их загружать в двумерный массив Numpy, который задает первый вопрос:

  • Так как количество строк неизвестно в начале загрузки, как можно очень большой массив numpy будет построен наиболее эффективно, строка за строкой?

Простое добавление строки в массив было бы неэффективно с точки зрения памяти, так как два больших массива на мгновение сосуществуют. Такая же проблема может возникнуть, если вы используете numpy.append. Функции stack многообещающие, но в идеале я бы хотел увеличить массив на месте.

Это приводит ко второму вопросу:

  • Как лучше всего наблюдать за использованием памяти программой на Python, которая сильно использует массивы NumPy?

Для изучения вышеуказанной проблемы я использовал обычные инструменты профилирования памяти - heapy и pympler - но получаю только размер объектов внешнего массива (80 байт), а не данные, которые они содержат. Помимо грубого измерения того, сколько памяти использует процесс Python, как я могу получить «полный» размер массивов по мере их роста?

Локальные детали: OSX 10.6, Python 2.6, но приветствуются общие решения.

Ответы [ 4 ]

7 голосов
/ 08 октября 2009

Нет никакого способа гарантировать, что вы можете увеличить массив на месте, кроме создания пустого массива (numpy.empty) максимально возможного размера и последующего использования его в конце. Вы не можете начать с малого, потому что нет гарантии, что вы сможете расширить любую память на карте, не забивая некоторые другие данные. (И все это намного ниже уровня, который позволяет python получить изнутри интерпретатора.)

Ваша лучшая ставка, вероятно, numpy.fromiter . Если посмотреть на источник, то при увеличении количества элементов массив увеличивается каждый раз на чуть более 50%. Если вы можете легко получить количество строк (скажем, путем подсчета строк), вы даже можете передать ему количество.

2 голосов
/ 12 января 2011

Вы пробовали использовать файл memmap? Вы можете перебирать свой входной файл (по возможности, в виде фрагментов), преобразовывать входящие данные и вставлять их в виде строк в массив с отображением в памяти. Недостатком является увеличение дискового ввода-вывода в случае нехватки основной памяти и необходимости подкачки подкачки.

См .: http://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html

Другая альтернатива - это PyTables. Вам нужно будет создать какую-то специальную sql-подобную таблицу, но это довольно просто. Фактически, он обеспечивает прозрачное сохранение диска (автоматическая сериализация) и иерархическую организацию ваших данных. Это также ограничивает объем используемой основной памяти.

См .: www.pytables.org/moin/HowToUse

.

Удачи!

1 голос
/ 08 октября 2009

По возможности можно сначала сделать один проход по файлу, чтобы посчитать количество строк, не загружая их.

Другой вариант - удваивать размер таблицы каждый раз, что имеет два преимущества:

  1. Вы будете перераспределять память журнала (n) только тогда, когда n - количество строк.
  2. Вам нужно только на 50% больше оперативной памяти, чем ваш самый большой размер стола

Если вы выберете динамический маршрут, вы можете измерить длину первой строки в байтах, а затем угадать количество строк путем вычисления (число байтов в файле / число байтов в первой строке). Начните с таблицы такого размера.

0 голосов
/ 12 февраля 2013

Проблема, по сути, в текстовом файле. Когда ваши входные данные хранятся в более сложном виде, таких проблем можно избежать. Возьмем, к примеру, проект h5py . Стоит потрудиться сначала преобразовать данные в файлы HDF5, а затем запустить сценарии анализа файлов HDF5.

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