Как я могу совместно использовать память между процессами в MATLAB?

Вы можете использовать

dataTable
    .showGroups(false)

, чтобы скрыть строки группировки ( документация ).

К сожалению, в настоящее время нет способа помешать dc.js сгруппировать таблицу данных, но если функция .group() возвращает постоянное значение, вы получите одну группу.

Не путайте эту функцию .group() с функциями других графиков. Это совершенно другое.

6
задан gnovice 12 May 2017 в 04:30
поделиться

4 ответа

Если процессы только читают данные, но не изменяют их, то я считаю, что вы можете поместить свои входные данные в один большой файл. и пусть каждый процесс будет открыт и прочитан из этого файла. У каждого процесса будет собственный индикатор положения файла, который он может перемещать в любом месте файла для чтения необходимых данных. Я тестировал, что два процесса MATLAB одновременно читают из файла около миллиона раз каждый, и все, казалось, работало нормально. Я использовал только основные команды файлового ввода-вывода (перечисленные ниже). Похоже, вы также можете сделать это, используя MEMMAPFILE , как г-н Фуз упомянул в своем ответе (и SCFrench в комментарии), если у вас есть версия MATLAB R2008a или новее.

Вот некоторые из команд файлового ввода-вывода, которые вы, вероятно, будете использовать для этого:

  • FOPEN : Каждый процесс вызовет FOPEN и вернет идентификатор файла, который будет использовать во всех последующих вызовах. Вы можете открыть файл в двоичном или текстовом режиме:

     fid = fopen ('data.dat', 'r'); % Двоичный режим
    fid = fopen ('data.txt', 'rt'); % Текстовый режим
    
  • FREAD : В двоичном режиме FREAD будет читать данные из файла:

     A = fread (fid, 20, 'double'); % Считывает 20 значений с двойной точностью
    
  • FSCANF : В текстовом режиме FSCANF будет читать и форматировать данные из файла:

     A = fscanf (fid, '% d', 4); % Читает 4 целочисленных значения
    
  • FGETL / FGETS : В текстовом режиме они будут читать целые строки из файла.

  • FTELL : Это покажет вам текущий индикатор позиции файла в байтах из начало файла:

     ftell (fid)
    ans =
     8% Индикатор позиции - 8 байт от начала файла
    
  • FSEEK : это установит индикатор положения файла на желаемую позицию в файле:

     fseek (fid, 0, -1); % Перемещает индикатор позиции в начало файла
    
  • FCLOSE : Каждый процесс должен будет закрыть свой доступ к файлу (это легко забыть):

     fclose (fid);
    

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


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

6
ответ дан 8 December 2019 в 14:46
поделиться

РЕДАКТИРОВАТЬ: Поместите данные в необработанный файл и используйте memmapfile (спасибо SCFrench).

============================================

Нет, реального способа сделать это нет.

Два моих лучших решения: купить больше ОЗУ или страницы в данных.

Ближайшее, что вы могли бы сделать, это использовать функцию mex для выделения разделяемой памяти, а затем разрешить последовательные вызовы функции mex для извлечения из меньших кусочков памяти. Вы бы не хотели оборачивать разделяемую память как массив Matlab (потому что модель памяти Matlab не справилась бы с этим должным образом).

Я собирался предложить изучить memmap, но, очевидно, это проблематично .

Иногда вы можете сначала запустить одну программу Matlab для предварительной обработки или разделения данных на более мелкие части.

4
ответ дан 8 December 2019 в 14:46
поделиться

Вероятно, нет, по крайней мере, не так, как вы обрабатываете данные как обычную переменную MATLAB.

На компьютере с Windows вы можете создать оболочку COM / ActiveX для доступа к вашим общим данным. MATLAB позволяет использовать COM-объекты через функцию actxserver . Но сомнительно, что вы действительно можете получить доступ к данным «напрямую» через различные процессы. Между MATLAB и COM существует какой-то уровень маршалинга, и данные преобразуются, по крайней мере, согласно документам Mathworks по обмену данными между MATLAB и COM . Если бы у меня абсолютно было для совместного использования структурированных данных между процессами с быстрым доступом на машине Windows, я бы, вероятно, написал что-нибудь на C ++ для использования общей памяти через Boost :: interprocess и оберните доступ к нему во внутрипроцессный COM-сервер (DLL). Я уже делал это раньше, однажды. Насколько Boost :: interprocess делает его намного проще, это боль.

Подход Java (поскольку MATLAB работает поверх Java) был бы намного более многообещающим, но, насколько я знаю, нет никаких достойные библиотеки Java для обеспечения доступа к разделяемой памяти. Ближайшим вариантом, вероятно, является использование файла с отображением в память через java.nio.MappedByteBuffer , но это действительно низкоуровневый. Тем не менее, если ваши данные имеют относительно "квадратную" форму (например, большая двумерная, трехмерная или четырехмерная матрица однородных данных), это может работать нормально.

Вы можете попробовать использовать файлы HDF5 MATLAB имеет встроенную поддержку HDF5 , и это «относительно» быстро. Но по моему опыту, HDF5 не Кажется, он очень хорошо работает с параллелизмом. (по крайней мере, когда один процесс пишет, а другие являются читателями. Если есть несколько читателей и нет писателей, все работает нормально.)

1
ответ дан 8 December 2019 в 14:46
поделиться

Вы можете проверить мою заявку на обмен файлами Matlab "sharedmatrix" # 28572. Это позволяет матрице Matlab существовать в общей памяти, если вы используете какой-либо вариант Unix. Затем можно было бы присоединить разделяемую матрицу к телу parfor или spmd, т. е.

shmkey=12345;
sharedmatrix('clone',shmkey,X);
clear X;
spmd(8)
    X=sharedmatrix('attach',shmkey);
    % do something with X
    sharedmatrix('detach',shmkey,X);
end
sharedmatrix('free',shmkey);

поскольку X существует в разделяемой памяти для тела spmd (или parfor), у него нет времени загрузки и времени связи. С точки зрения Matlab это вновь созданная переменная в теле spmd (или parfor).

Ура,

Джош

http://www.mathworks.com/matlabcentral/fileexchange/28572-sharedmatrix

5
ответ дан 8 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

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