Подтвердить что ты не робот

Поэтапное создание массива numpy и измерение использования памяти

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Смотрите: http://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html

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

Смотрите: www.pytables.org/moin/HowToUse

Удачи!

Ответ 3

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

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

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

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

Ответ 4

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