Если процессы когда-либо только читают данные, но не изменяют их, то я считаю, что вы можете поместить свои входные данные в один большой файл, и каждый процесс будет открыт и прочитан из этого файла. Каждый процесс будет иметь свой собственный индикатор положения файла, который он может перемещать в любом месте файла, чтобы прочитать необходимые ему данные. Я проверил наличие двух процессов MATLAB, одновременно считывающих файл из миллиона или около того раз, и все, казалось, работало нормально. Я использовал только основные команды ввода / вывода файлов (перечислены ниже). Похоже, вы также можете сделать это, используя MEMMAPFILE , как Mr Fooz , упомянутый в его ответе (и SCFrench в комментарии), при условии, что у вас версия MATLAB R2008a или новее.
Вот некоторые команды ввода-вывода, которые вы, вероятно, будете использовать для этого:
FOPEN : каждый процесс вызывает FOPEN и возвращает идентификатор файла, который он будет использовать во всех последующих вызовах. Вы можете открыть файл в режиме двоичный или текст :
fid = fopen('data.dat','r'); % Binary mode
fid = fopen('data.txt','rt'); % Text mode
FREAD : в двоичном режиме FREAD будет считывать данные из файла:
A = fread(fid,20,'double'); % Reads 20 double-precision values
FSCANF : в текстовом режиме FSCANF будет считывать и форматировать данные из файла:
A = fscanf(fid,'%d',4); % Reads 4 integer values
FGETL / FGETS : в текстовом режиме они читают целые строки из файла.
FTELL : будет указана текущая позиция файла в байтах от начала файла:
ftell(fid)
ans =
8 % The position indicator is 8 bytes from the file beginning
FSEEK : Это установит индикатор положения файла на желаемую позицию в файле:
fseek(fid,0,-1); % Moves the position indicator to the file beginning
FCLOSE : каждому процессу придется закрыть доступ к файлу (это легко забыть сделать):
fclose(fid);
Это решение, вероятно, потребует, чтобы входной файл имел хорошо структурированный формат, который легко пересекается (то есть только одна большая матрица). Если в нем много полей переменной длины, то чтение данных из правильной позиции в файле может быть очень сложным.
Если процессы также должны изменить данные, это может стать еще более трудным. Как правило, вы не хотите, чтобы файл / область памяти были одновременно записаны несколькими процессами или записаны одним процессом, в то время как другой читает из того же расположения, поскольку это может привести к нежелательному поведению. В таком случае вам придется ограничить доступ к файлу таким образом, чтобы над ним одновременно работал только один процесс. Другие процессы должны будут ждать, пока первый не будет сделан. Примерная версия кода, которую каждый процесс должен был бы запустить в таком случае:
processDone = false;
while ~processDone,
if file_is_free(), % A function to check that other processes are not
% accessing the file
fid = fopen(fileName,'r+'); % Open the file
perform_process(fid); % The computation this process has to do
fclose(fid); % Close the file
processDone = true;
end
end
Механизмы синхронизации, подобные этим (" lock ") могут иногда иметь большие накладные расходы, что снижает общую параллельную эффективность кода.