Решение ошибок “Нехватка памяти”

Эта тема объясняет несколько стратегий, которые можно использовать в ситуациях, где MATLAB® исчерпывает память. MATLAB является 64-битным приложением, которое работает на 64-битных операционных системах. Оно возвращает сообщение об ошибке от операционной системы каждый раз, когда запрашивается сегмент памяти больший, чем доступно памяти.

MATLAB имеет встроенную защиту от создания массивов, которые являются слишком большими. По умолчанию MATLAB может использовать до 100% RAM (не включая виртуальную память) вашего компьютера, чтобы выделить память для массивов, и если массив превысил бы тот порог, то MATLAB возвращает ошибку. Например, этот оператор пытается создать массив с неблагоразумным размером:

A = rand(1e6,1e6);
Error using rand
Requested 1000000x1000000 (7450.6GB) array exceeds maximum array size preference. Creation of arrays greater than this limit may take a long time and cause
MATLAB to become unresponsive.

More information
Смотрите Рабочую область и Настройки переменной для получения информации о корректировке этого предела размера массивов. Если вы выключаете предел размера массивов, то MATLAB возвращает различную ошибку:

A = rand(1e6,1e6);
Out of memory.

More information

Неважно, как вы сталкиваетесь с пределами памяти, существует несколько разрешений, доступных в зависимости от ваших целей. Методы, обсужденные в Стратегиях Эффективного использования Памяти, могут помочь вам оптимизировать доступную память, включая которую вы имеете:

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

Усильте tall Массивы

Длинные массивы для Данных, которые не помещаются в память, спроектированы, чтобы помочь вам работать с наборами данных, которые являются слишком большими, чтобы поместиться в память. MATLAB работает с маленькими блоками данных за один раз, автоматически обрабатывая все разделение на блоки данных и обработку в фоновом режиме. Существует два первичных способа, которыми можно усилить длинные массивы:

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

    B = tall(A)
    Этот метод включает вам, работают с большими массивами, которые могут уместиться в памяти, но которые используют слишком много памяти, чтобы допускать копии данных во время вычислений. Например, если у вас есть 8 ГБ RAM, и матрица на 5 ГБ, бросая матрицу к длинному массиву позволяет вам выполнить вычисления на матрице, не исчерпывая память. Смотрите Преобразуют Массивы В оперативной памяти в Длинные массивы для примера этого использования.

  2. Если у вас есть файл или основанные на папке данные, можно создать a datastore и затем создайте высокий массив поверх datastore:

    ds = datastore('path/to/data.csv');
    tt = tall(ds);
    Этот метод дает вам полную мощность длинных массивов в MATLAB: данные могут иметь любое количество строк, и в MATLAB не заканчивается память. И потому что datastore работает и с районами локальных и с удаленных данных, данные, с которыми вы работаете, не должны быть на компьютере, который вы используете, чтобы анализировать их. Смотрите работу с Удаленными данными для получения дополнительной информации.

Усильте память о нескольких машинах

Если у вас есть кластер компьютеров, можно использовать Parallel Computing Toolbox™ и Распределенные Массивы (Parallel Computing Toolbox), чтобы выполнить вычисления с помощью объединенной памяти обо всех машинах в кластере. Это позволяет вам работать с целым распределенным массивом как одна сущность. Однако рабочие действуют только с их стороны массива, и автоматически передают данные между собой при необходимости.

Создание распределенного массива очень похоже на создание длинного массива:

ds = datastore('path/to/data.csv');
dt = distributed(ds);

Загрузите только столько данные, сколько вам нужно

Другой возможный способ зафиксировать проблемы памяти состоит в том, чтобы только импортировать в MATLAB такое количество большого набора данных, как вам нужно для задачи, которую вы пытаетесь решить. Это обычно не проблема при импорте из источников, таких как база данных, где можно явным образом искать элементы, совпадающие с запросом. Но это - типичная проблема с загрузкой большого плоского текста или двоичных файлов.

datastore функция позволяет вам работать с большими наборами данных инкрементно. Эта функция подкрепляет Длинные массивы для Данных, которые не помещаются в память, и Распределенных Массивов (Parallel Computing Toolbox), но можно использовать его для других целей также. Хранилища данных полезны любое время, вы хотите загрузить небольшие части набора данных в память за один раз.

Чтобы создать datastore, необходимо обеспечить имя файла или директории, содержащей набор файлов с подобным форматированием. Например, с одним файлом:

ds = datastore('path/to/file.csv')
Или, с набором файлов в папке:
ds = datastore('path/to/folder/')
Можно также использовать подстановочный символ * выбрать все файлы определенного типа, как в:
ds = datastore('data/*.csv')
Хранилища данных поддерживают большое разнообразие форматов общего файла (табличные данные, изображения, электронные таблицы, и так далее). Смотрите Выбирают Datastore for File Format или Application для получения дополнительной информации.

Кроме хранилищ данных, MATLAB также имеет несколько других функций, чтобы загрузить части файлов, такой как matfile функционируйте, чтобы загрузить фрагменты MAT-файлов. Эта таблица суммирует частичные функции загрузки типом файла.

FileType Частичная загрузка
Matfile

Загрузите часть переменной путем индексации в объект, который вы создаете с matfile функция. Смотрите Большие данные в Файлах MAT для примера этого использования.

Текст

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

Двоичный файл

Можно использовать низкоуровневые функции ввода-вывода двоичного файла, такой как fread, к частям доступа любого файла, который имеет известный формат. Для двоичных файлов неизвестного формата попытайтесь использовать размещение в ОЗУ с memmapfile функция.

Отобразите, HDF, аудио и видео

Многие функции MATLAB, которые поддерживают загрузку от этих типов файлов, позволяют вам выбирать фрагменты данных, чтобы читать. Для получения дополнительной информации смотрите страницы ссылки на функцию, перечисленные в Поддерживаемых Форматах файлов для Импорта и экспорта.

Увеличение системной области подкачки

Общая память, доступная для приложений на вашем компьютере, состоит из физической памяти (RAM), плюс page file или swap file, на диске. Файл подкачки может быть очень большим (например, 512 терабайт на 64-битном Windows®). Операционная система выделяет виртуальную память для каждого процесса к физической памяти или к файлу подкачки, в зависимости от потребностей системы и других процессов. Увеличение размера файла подкачки может увеличить общую доступную память, но также и обычно приводит к более медленной эффективности.

Большинство систем позволяет вам управлять размером своего файла подкачки. Включенные шаги зависят от вашей операционной системы:

  • Windows Systems Используйте Панель управления Windows Control Panel, чтобы изменить размер страничного файла виртуальной памяти в вашей системе. Для получения дополнительной информации обратитесь к справке Windows.

  • Linux® Systems — Измените свою область подкачки при помощи mkswap и swapon команды. Для получения дополнительной информации, в подсказке Linux вводят man сопровождаемый названием команды.

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

Установление предела процесса для систем Linux

process limit является максимальной суммой виртуальной памяти, к которой может обратиться один процесс (или приложение). В маловероятном случае вы установили эту настройку, это должно быть достаточно большим, чтобы вместить:

  • Все данные к процессу

  • Файлы программы MATLAB

  • Сам исполняемый файл MATLAB

  • Дополнительная информация состояния

64-битные операционные системы поддерживают предел процесса 8 терабайт. В системах Linux смотрите ulimit команда, чтобы просмотреть и пределы пользователя аппарата включая виртуальную память.

Отключение Java VM в системах Linux

В системах Linux, если вы запускаете MATLAB без Java® JVM™, можно увеличить доступную память рабочей области приблизительно на 400 мегабайтов. Чтобы запустить MATLAB без JVM Java, используйте параметр командной строки -nojvm. Эта опция также увеличивает размер самого большого непрерывного блока памяти приблизительно той же суммой. Путем увеличения самого большого непрерывного блока памяти вы увеличиваете самый большой матричный размер.

Используя -nojvm идет со штрафом в этом, вы теряете много функций, которые используют программное обеспечение Java, включая целую среду разработки. Стартовый MATLAB с -nodesktop опция не сохраняет значительного количества памяти.

Смотрите также

Похожие темы