Если процессы только когда-либо чтения данных, но не изменяет, то я полагаю, вы можете разместить свои входные данные в один большой файл и имеете каждый процесс открытым и читать из этого файла. Каждый процесс будет иметь свой собственный указатель позиции файла, чтобы он мог перемещаться в любом месте файла, чтобы читать нужные ему данные. Я тестировал, что два процесса 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
механизмы синхронизации, подобные этим («locks») иногда может иметь высокую нагрузку, что уменьшает общую параллельную эффективность кода.
Мои данные могут быть большими, но является статическим, т.е. функция не изменяет его. Да. Чтение файла может действительно работать. – AnnaR