Wenn die Prozesse immer nur lesen die Daten, aber nicht ändern es, dann glaube ich, Sie Ihre Eingabedaten in eine große Datei platzieren und haben jeden Prozess geöffnet und aus dieser Datei lesen. Jeder Prozess verfügt über einen eigenen Dateipositionsindikator, mit dem er sich überall in der Datei bewegen kann, um die benötigten Daten zu lesen. Ich testete, dass zwei MATLAB-Prozesse gleichzeitig eine Million Mal aus einer Datei lesen und alles schien gut zu funktionieren. Ich habe nur grundlegende Datei-E/A-Befehle verwendet (siehe unten). Es scheint, dass Sie dies auch mit MEMMAPFILE, wie Mr Fooz in seiner Antwort erwähnt (und SCFrench in einem Kommentar) tun können, vorausgesetzt, Sie haben MATLAB Version R2008a oder neuer.
Hier sind einige der Datei-I/O-Befehle, die Sie wahrscheinlich für diese verwenden:
FOPEN: Jeder Prozess wird FOPEN anrufen und eine Dateikennung zurückgeben in allen nachfolgenden Anrufe verwenden. Sie können in eine Datei öffnen, entweder binäre oder Text Modus:
fid = fopen('data.dat','r'); % Binary mode
fid = fopen('data.txt','rt'); % Text mode
FREAD: Im Binärmodus FREAD werden die Daten aus der Datei lesen:
A = fread(fid,20,'double'); % Reads 20 double-precision values
FSCANF: Im Text Modus wird FSCANF Daten aus der Datei lesen und formatieren:
FGETL/FGETS: Im Textmodus lesen diese ganze Zeilen aus der Datei.
FTELL: Dies wird Ihnen sagen, die aktuelle Anzeige Dateiposition in Bytes vom Anfang der Datei:
ftell(fid)
ans =
8 % The position indicator is 8 bytes from the file beginning
FSEEK: Diese Datei Positionsanzeiger in eine gewünschte Position in der Datei gesetzt werden:
fseek(fid,0,-1); % Moves the position indicator to the file beginning
FCLOSE: Jeder Prozess wird der Zugriff auf die Datei schließen (es ist einfach zu vergessen, dies zu tun):
fclose(fid);
Diese Lösung, die die Eingabedatei ein gut strukturiertes Format hat wahrscheinlich erfordern, die leicht zu durchlaufen ist (d nur eine große Matrix). Wenn es viele Felder variabler Länge hat, kann das Lesen von Daten von der richtigen Position in der Datei sehr schwierig werden.
Wenn die Prozesse müssen auch die Daten ändern, könnte dies noch schwieriger bekommen. Im Allgemeinen möchten Sie nicht, dass eine Datei/ein Speicherort gleichzeitig von mehreren Prozessen beschrieben oder von einem Prozess geschrieben wird, während ein anderer von demselben Speicherort liest, da unerwünschtes Verhalten die Folge sein kann. In einem solchen Fall müssten Sie den Zugriff auf die Datei so beschränken, dass jeweils nur ein Prozess ausgeführt wird. Andere Prozesse müssten warten, bis die erste fertig ist.Eine Probe-Version des Codes, die jeder Prozeß haben würde in einem solchen Fall ausgeführt werden soll:
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
Synchronisationsmechanismen wie diese („locks“) kann manchmal eine hohe Overhead, der den Gesamt parallel Effizienz des Codes reduziert.
Meine Daten groß sein kann, aber statisch, das heißt, wird die Funktion nicht geändert werden. Ja. Das Lesen einer Datei könnte tatsächlich funktionieren. – AnnaR