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

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

MATLAB имеет встроенную защиту от создания слишком больших массивов. По умолчанию MATLAB может использовать до 100% оперативной памяти (не включая виртуальную память) вашего компьютера для выделения памяти для массивов, и если массив превысит этот порог, то 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 Массивы

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

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

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

  2. Если у вас есть данные на основе файлов или папок, можно создать 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 функция позволяет вам работать с большими наборами данных постепенно. Эта функция лежит в основе Длинные Массивы for Данная , Которая Не Помещаются в Память, and Distributed Arrays (Parallel Computing Toolbox), но можно использовать и в других целях. Datastores полезны в любое время, когда вы хотите загрузить небольшие фрагменты набора данных в память за раз.

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

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

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

Тип файлаЧастичная загрузка
MAT-файл

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

Текст

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

Набор из двух предметов

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

Изображение, HDF, аудио и видео

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

Увеличение пространства системной замены

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

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

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

  • Linux® Системы - Измените пространство подкачки при помощи mkswap и swapon команды. Для получения дополнительной информации в строке приглашения Linux man далее указывается имя команды.

Отсутствует интерфейс для непосредственного управления пространством подкачки в системах macOS.

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

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

  • Все данные для обработки

  • Программа MATLAB файлы

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

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

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

Отключение виртуальной машины Java в Linux-системах

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

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

См. также

Похожие темы