Si los procesos sólo ha leído los datos, pero no modifican , entonces yo creo que puede colocar sus datos de entrada en un archivo grande y hacer que cada proceso abierto y leído de ese archivo. Cada proceso tendrá su propio indicador de posición de archivo que puede moverse a cualquier parte del archivo para leer los datos que necesita. Probé teniendo dos procesos de MATLAB leyendo simultáneamente de un archivo un millón o más por cada uno y todo parecía funcionar bien. Solo usé comandos de E/S de archivos básicos (enumerados a continuación). Parece que también puede hacer esto usando MEMMAPFILE, como Mr Fooz mencionado en su respuesta (y SCFrench en un comentario), suponiendo que tiene la versión R2008a o posterior de MATLAB.
Éstos son algunos de los archivos de E/S comandos que es probable que utilice para esto:
FOPEN: Cada proceso llamará FOPEN y devolver un identificador de archivo se utilizará en todas las llamadas posteriores. Puede abrir un archivo en cualquiera binario o texto modo:
fid = fopen('data.dat','r'); % Binary mode
fid = fopen('data.txt','rt'); % Text mode
FREAD: En modo binario, FREAD leerá los datos desde el archivo:
A = fread(fid,20,'double'); % Reads 20 double-precision values
FSCANF: En el texto modo, FSCANF leerá y formateará los datos del archivo:
A = fscanf(fid,'%d',4); % Reads 4 integer values
FGETL/FGETS: en modo texto, leerán líneas enteras del archivo.
FTELL: Esto le dirá el indicador de posición actual del fichero en bytes desde el comienzo del archivo:
ftell(fid)
ans =
8 % The position indicator is 8 bytes from the file beginning
FSEEK: Esto establecerá el indicador de posición del fichero a una posición deseada en el archivo:
fseek(fid,0,-1); % Moves the position indicator to the file beginning
FCLOSE: Cada proceso tendrá que cerrar su acceso al archivo (que es fácil de olvidar para hacer esto):
fclose(fid);
Esta solución es probable que requiera que el archivo de entrada tiene un formato bien estructurado que es fácil de recorrer (es decir, solo una matriz grande). Si tiene muchos campos de longitud variable, leer los datos desde la posición correcta en el archivo podría ser muy complicado.
Si los procesos tienen que modificar también los datos, esto podría ser aún más difícil. En general, no desea que una ubicación de archivo/memoria sea escrita simultáneamente por procesos múltiples, o escrita por un proceso mientras que otra está leyendo desde la misma ubicación, ya que puede resultar en un comportamiento no deseado. En tal caso, deberá limitar el acceso al archivo de modo que solo opere un proceso a la vez. Otros procesos tendrían que esperar hasta que termine el primero.Una versión de muestra de código que cada proceso tendría que funcionar en tal caso es:
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
mecanismos de sincronización como estos ("locks") a veces pueden tener una alta sobrecarga que reduce la eficiencia paralelo general del código.
Mis datos pueden ser grandes, pero es estática, es decir, la función no se cambie. Sí. Leer un archivo podría funcionar. – AnnaR