2016-07-25 6 views
0

Mein MATLAB-Programm N=100 Trajektorien mit T=10^8 Zeitschritten in jedem erzeugt, dhVerarbeitung eine große Datenmenge

x = randn(10^8,100); 

Letztlich mag ich diese Datenmenge verarbeiten und eine durchschnittliche Autokorrelation aller Bahnen erhalten:

y = mean(fft(x),2); % output size (10^8, 1) 

da nun x zu groß ist, zu speichern, meine einzige gangbare Weg ist es auf der Festplatte in kleine Stücke speichern von 10^6

x1 = randn(10^6, 100); 
x2 = randn(10^6, 100); 
etc 

und dann y erhalten, indem jede Bahn Verarbeitung n=1:100 einzeln und Akkumulieren des Ergebnisses:

for n=1:100 
y = y + fft([x1(:,n); x2(:,n); ...; x100(:,n)]); 
end 

Gibt es eine elegantere Möglichkeit, dies zu tun? Ich habe 100 GB RAM und einen Pool von 12 Mitarbeitern.

+1

Haben Sie versucht, die Funktion 'matfile' zu ​​verwenden? Nach Mathworks funktioniert diese Funktion 'Zugriff und Änderung Variablen direkt in MAT-Dateien, ohne in den Speicher zu laden ' – obchardon

+0

hmmmm Sie haben 100 GB RAM und es ist würgen auf 10^8 * 100 ....? – GameOfThrows

+0

WARTEN! verwenden Sie wirklich 100 Variablen namens x1, x2, x3 ... x100 ?? Das ist eine schreckliche Idee. Verwende Zellen oder 3D-Matrizen! –

Antwort

0

Ein einfacherer Weg wäre, Ihre Daten einmal zu erzeugen und sie dann in kleine Stücke zu zerlegen, die Sie auf Festplatte speichern, oder, wenn möglich, die Daten auf den Arbeitern selbst zu erstellen.

x = randn(10^8,100); 
for ii=1:100 
    if ii ~=100 
     tmp = x(ii:ii+1e6) 
    else 
     tmp = x(ii:end); %ii+1e6 would result in end+1 
    end 
    filename = sprintf('Dataset%i',ii); %create filename 
    save(filename,tmp,'-v7.3'); %save file to disk in -v7.3 format 
end 

y = cell(100,1) %initialise output 
parfor ii = 1:100 
    filename = sprintf('Dataset%i',ii); %get the filenames back 
    load(filename); %load the file 
    y{ii} = mean(fft(tmp),2); % I called it tmp when saving, so it's called tmp here 
end 

Jetzt können Sie die Ergebnisse aus der Zelle y in der gewünschten Weise akkumulieren. Sie können natürlich mit der Anzahl der erstellten Dateien experimentieren, da weniger Dateien aufgrund des Overheads von parfor schneller verarbeitet werden.

+0

Eigentlich musste ich nur das .mat-Format auf -v7.3 setzen und jetzt reicht eine einzige Datei aus, um alle meine Daten zu speichern. Ich nahm irgendwie an, dass das neueste Matlab auf einer 64-Bit-Maschine seine Dateien standardmäßig mit dem neuesten Format speichern würde, also habe ich mich nicht um solche Optionen gekümmert ... –