Размещение в ОЗУ является механизмом, который сопоставляет фрагмент файла или всего файла на диске с областью значений адресов в адресном пространстве приложения. Затем приложение может получить доступ к файлам на диске таким же образом, как и к динамической памяти. Это ускоряет чтение и запись файлов по сравнению с использованием таких функций, как fread
и fwrite
.
Основными преимуществами размещения в ОЗУ являются эффективность, более быстрый доступ к файлам, возможность совместного использования памяти между приложениями и более эффективное кодирование.
Доступ к файлам через карту памяти быстрее, чем с помощью функций ввода-вывода, таких как fread
и fwrite
. Данные считываются и записываются с помощью встроенных в операционную систему возможностей виртуальной памяти, а не необходимости выделять, копировать и затем освобождать буферы данных, принадлежащие процессу.
MATLAB® не получает доступ к данным с диска при первом построении карты. Он только читает или записывает файл на диск, когда получен доступ к определенной части карты памяти, и затем он только читает эту часть. Это обеспечивает более быстрый случайный доступ к сопоставленным данным.
Сопоставление файла с памятью позволяет получить доступ к данным в файле, как если бы эти данные были считаны в массив в адресном пространстве приложения. Первоначально MATLAB выделяет только адресное пространство для массива; он не считывает данные из файла до тех пор, пока вы не получите доступ к сопоставленной области. В результате сопоставленные с памятью файлы обеспечивают механизм, с помощью которого приложения могут получить доступ к сегментам данных в чрезвычайно большом файле, не считывая сначала весь файл в память.
Размещение в ОЗУ в вашем приложении MATLAB позволяет вам получить доступ к файловым данным с помощью стандартных операций индексации MATLAB. После сопоставления файла с памятью можно считать содержимое этого файла, используя тот же тип выражений MATLAB, который используется для чтения переменных из Рабочего пространства MATLAB. Содержимое отображаемого файла выглядит так, как будто это массив в текущей активной рабочей области. Вы просто индексируете в этот массив, чтобы считать или записать желаемые данные из файла. Поэтому вам не нужны явные вызовы на fread
и fwrite
функций.
В MATLAB, если x
является сопоставленной с памятью переменной и y
данные, которые будут записаны в файл, тогда запись в файл будет такой же простой, как и
x.Data = y;
Сопоставленные с памятью файлы также обеспечивают механизм обмена данными между приложениями, как показано на рисунке ниже. Это достигается тем, что каждый раздел карты приложения одного и того же файла. Можно использовать эту функцию для передачи больших наборов данных между MATLAB и другими приложениями.
Кроме того, в рамках одного приложения можно более одного раза сопоставить один и тот же сегмент файла.
То, какое преимущество вы получаете от отображения файла в память, в основном зависит от размера и формата файла, способа использования данных в файле и используемой вами компьютерной платформы.
Размещение в ОЗУ лучше всего работает с двоичными файлами, и в следующих сценариях:
Для больших файлов, к которым вы хотите получить доступ случайным образом один или несколько раз
Для небольших файлов, которые вы хотите считать в память один раз и часто обращаться
Для данных, которыми вы хотите делиться между приложениями
Когда вы хотите работать с данными в файле, как если бы это был массив MATLAB
Следующие типы файлов не полностью используют преимущества размещения в ОЗУ:
Форматированные двоичные файлы, такие как HDF или TIFF, которые требуют настроенных читателей, не полезны для размещения в ОЗУ. Описание данных, содержащихся в этих файлах, может быть очень сложной задачей. Кроме того, вы не можете получить доступ к данным непосредственно из сопоставленного сегмента, но должны вместо этого создать массивы для хранения данных.
Текстовые или ASCII-файлы требуют, чтобы вы преобразовали текст в сопоставленной области в соответствующий тип, чтобы данные были значимыми. Это занимает дополнительное адресное пространство.
Файлы размером более нескольких сотен мегабайт потребляют значительное количество виртуального адресного пространства, необходимого MATLAB для обработки вашей программы. Сопоставление файлов такого размера может привести к тому, что MATLAB чаще сообщает об ошибках, не связанных с памятью. Это более вероятно, если MATLAB работает в течение некоторого времени, или если память, используемая MATLAB, становится фрагментированной.
Из-за пределов, установленных операционной системой и MATLAB, максимальный объем данных, которые вы можете сопоставить с одним образцом карты памяти, составляет 2 гигабайта в 32-битных системах и 256 терабайт в 64-битных системах. Если вам нужно сопоставить больше, чем этот предел, можно либо создать отдельные карты для различных областей файла, либо можно переместить окно одной карты в другие места в файле.
Размещение в ОЗУ работает только с данными, которые имеют ту же схему упорядоченного расположения байтов, что и собственное упорядоченное расположение байтов вашей операционной системы. Для примера, потому что Linux обоих Linus Torvalds® и Microsoft® Windows® системы используют малоэндовое упорядоченное расположение байтов, данные, созданные в системе Linux, могут считываться в системах Windows. Вы можете использовать computer
функция для определения собственного упорядоченного расположения байтов в текущей системе.