Вот мое:
«Вам не нужен (текстовый) синтаксис для выражения объектов и их поведения».
Я присоединяюсь к идеям Джонатана Эдвардса и его проекта Subtext - http://alarmingdevelopment.org/
PyTables и NumPy - лучший вариант.
PyTables будет хранить данные на диске в формате HDF с дополнительным сжатием. Мои наборы данных часто подвергаются 10-кратному сжатию, что удобно при работе с десятками или сотнями миллионов строк. К тому же это очень быстро; мой 5-летний ноутбук может обрабатывать данные, выполняя SQL-подобную агрегацию GROUP BY со скоростью 1 000 000 строк в секунду. Неплохо для решения на основе Python!
Доступ к данным в виде повторного массива NumPy также прост:
data = table[row_from:row_to]
Библиотека HDF заботится о чтении соответствующих фрагментов данных и преобразовании в NumPy.
Вы должны иметь возможность использовать numpy.memmap для отображения памяти файла на диске. С более новым питоном и 64-битной машиной у вас должно быть необходимое адресное пространство, не загружая все в память. ОС должна обрабатывать только часть файла в памяти.
numpy.array
предназначены для хранения в памяти. Если вы хотите работать с матрицами большего размера, чем ваша оперативная память, вам нужно обойти это. Есть как минимум два подхода, которым вы можете следовать:
scipy.sparse.csc_matrix
. Для обработки разреженных матриц вам понадобится Пакет scipy
, расположенный поверх numpy
- см. здесь для получения дополнительных сведений о параметрах разреженной матрицы, которые предоставляет scipy
.
Сообщение Стефано Борини заставило меня посмотреть, насколько далеко продвинулся этот вид вещь уже есть.
Вот и все. Кажется, он делает в основном то, что вы хотите. HDF5 позволит вам хранить очень большие наборы данных, а затем обращаться к ним и использовать их так же, как NumPy.
Обычно, когда мы имеем дело с большими матрицами, мы реализуем их как разреженные матрицы .
Я не знаю, поддерживает ли numpy разреженные матрицы, но я обнаружил это вместо.
Вы спрашиваете, как работать с матрицей из 2 500 000 000 элементов без терабайт ОЗУ?
Способ обработки 2 миллиардов элементов без 8 миллиардов байтов ОЗУ заключается в том, чтобы не хранить матрицу в памяти.
Это означает, что гораздо более сложные алгоритмы извлекают ее из файловой системы по частям.
Насколько я знаю о numpy, нет, но я могу ошибаться.
Я могу предложить вам альтернативное решение: записать матрицу на диск и обращаться к ней по частям. Предлагаю вам формат файла HDF5. Если вам это нужно прозрачно, вы можете заново реализовать интерфейс ndarray, чтобы разбить матрицу, хранящуюся на диске, в память. Будьте осторожны, если вы измените данные, чтобы синхронизировать их с диском.
Убедитесь, что вы используете 64-битную операционную систему и 64-битную версию Python / NumPy. Обратите внимание, что на 32-разрядных архитектурах вы можете адресовать обычно 3 ГБ памяти (при этом около 1 ГБ теряется на ввод-вывод с отображением памяти и т. Д.).
С 64-битными и прочими массивами, превышающими доступную ОЗУ, вы можете обойтись виртуальной памятью, хотя все будет медленнее, если вам придется менять местами. Кроме того, карты памяти (см. Numpy.memmap) - это способ работать с огромными файлами на диске без загрузки их в память, но, опять же, вам нужно иметь 64-битное адресное пространство для работы, чтобы это было очень полезно. PyTables также сделает большую часть этого за вас.