Очень большие матрицы с помощью Python и NumPy

Вот мое:

«Вам не нужен (текстовый) синтаксис для выражения объектов и их поведения».

Я присоединяюсь к идеям Джонатана Эдвардса и его проекта Subtext - http://alarmingdevelopment.org/

82
задан Peter Mortensen 13 July 2014 в 13:23
поделиться

9 ответов

PyTables и NumPy - лучший вариант.

PyTables будет хранить данные на диске в формате HDF с дополнительным сжатием. Мои наборы данных часто подвергаются 10-кратному сжатию, что удобно при работе с десятками или сотнями миллионов строк. К тому же это очень быстро; мой 5-летний ноутбук может обрабатывать данные, выполняя SQL-подобную агрегацию GROUP BY со скоростью 1 000 000 строк в секунду. Неплохо для решения на основе Python!

Доступ к данным в виде повторного массива NumPy также прост:

data = table[row_from:row_to]

Библиотека HDF заботится о чтении соответствующих фрагментов данных и преобразовании в NumPy.

89
ответ дан 24 November 2019 в 09:04
поделиться

Вы должны иметь возможность использовать numpy.memmap для отображения памяти файла на диске. С более новым питоном и 64-битной машиной у вас должно быть необходимое адресное пространство, не загружая все в память. ОС должна обрабатывать только часть файла в памяти.

30
ответ дан 24 November 2019 в 09:04
поделиться

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

  1. Попробуйте более эффективное матричное представление , которое использует любую особую структуру, имеющуюся у ваших матриц. Например, как уже указывали другие, существуют эффективные структуры данных для разреженных матриц (матриц с большим количеством нулей), такие как scipy.sparse.csc_matrix .
  2. Измените свой алгоритм для работы с подматрицами . Вы можете читать с диска только те блоки матриц, которые в настоящее время используются в вычислениях. Алгоритмы, предназначенные для работы в кластерах, обычно работают поблочно, поскольку данные разбросаны по разным компьютерам и передаются только при необходимости. Например, алгоритм Фокса для умножения матриц (PDF-файл) .
55
ответ дан 24 November 2019 в 09:04
поделиться

Для обработки разреженных матриц вам понадобится Пакет scipy , расположенный поверх numpy - см. здесь для получения дополнительных сведений о параметрах разреженной матрицы, которые предоставляет scipy .

24
ответ дан 24 November 2019 в 09:04
поделиться

Сообщение Стефано Борини заставило меня посмотреть, насколько далеко продвинулся этот вид вещь уже есть.

Вот и все. Кажется, он делает в основном то, что вы хотите. HDF5 позволит вам хранить очень большие наборы данных, а затем обращаться к ним и использовать их так же, как NumPy.

11
ответ дан 24 November 2019 в 09:04
поделиться

Обычно, когда мы имеем дело с большими матрицами, мы реализуем их как разреженные матрицы .

Я не знаю, поддерживает ли numpy разреженные матрицы, но я обнаружил это вместо.

1
ответ дан 24 November 2019 в 09:04
поделиться

Вы спрашиваете, как работать с матрицей из 2 500 000 000 элементов без терабайт ОЗУ?

Способ обработки 2 миллиардов элементов без 8 миллиардов байтов ОЗУ заключается в том, чтобы не хранить матрицу в памяти.

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

3
ответ дан 24 November 2019 в 09:04
поделиться

Насколько я знаю о numpy, нет, но я могу ошибаться.

Я могу предложить вам альтернативное решение: записать матрицу на диск и обращаться к ней по частям. Предлагаю вам формат файла HDF5. Если вам это нужно прозрачно, вы можете заново реализовать интерфейс ndarray, чтобы разбить матрицу, хранящуюся на диске, в память. Будьте осторожны, если вы измените данные, чтобы синхронизировать их с диском.

1
ответ дан 24 November 2019 в 09:04
поделиться

Убедитесь, что вы используете 64-битную операционную систему и 64-битную версию Python / NumPy. Обратите внимание, что на 32-разрядных архитектурах вы можете адресовать обычно 3 ГБ памяти (при этом около 1 ГБ теряется на ввод-вывод с отображением памяти и т. Д.).

С 64-битными и прочими массивами, превышающими доступную ОЗУ, вы можете обойтись виртуальной памятью, хотя все будет медленнее, если вам придется менять местами. Кроме того, карты памяти (см. Numpy.memmap) - это способ работать с огромными файлами на диске без загрузки их в память, но, опять же, вам нужно иметь 64-битное адресное пространство для работы, чтобы это было очень полезно. PyTables также сделает большую часть этого за вас.

5
ответ дан 24 November 2019 в 09:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: