WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Maximale Variablengröße umgehen

 

Tobias14
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 15.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2014, 11:07     Titel: Maximale Variablengröße umgehen
  Antworten mit Zitat      
Hallo zusammen,

ich habe folgendes Problem:

Mit einer for-Schleife generiere ich pro Durchlauf einen Vektor (Länge 2000). Das es sich um ein kombinatorisches Problem handelt, generiere ich ca. 37,000,000 solcher Vektoren. In einer Matrix lässt sich das (zumindest mit meinem Computer) nicht mehr speichern da ich dazu 296 GB bräuchte (selbst mit 'logical' sind das noch 74 GB). Die Sparse-Funktion bringt mir an dieser Stelle leider auch nichts.

Im weiteren Verlauf brauche ich von der 2,000x37,000,000-Matrix jeweils nur die Summe der Zeilen (Ergebnis also wieder ein 2,000-Vektor).
Gibt es evtl. die Möglichkeit jeden der 37,000,000 Vektoren einzeln zu speichern (damit nicht mehr im Workspace und keine Probleme wegen Arbeitsspeicher auftreten) und später jeweils die n-te Zeilen von jedem einzelnen Vektor zu laden und zu summieren?
Oder fällt irgendjemand noch etwas besseres ein?

Ich wäre euch sehr dankbar!
Private Nachricht senden Benutzer-Profile anzeigen


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 15.12.2014, 11:35     Titel:
  Antworten mit Zitat      
Hallo,

es gibt sicher einen sinnvollen Weg, der zwischen den beiden extremen Wegen (1. alles im Workspace zu haben und 2. alles auf der HD zu speichern) liegt. Beispielsweise immer eine Million Vektoren speichern, oder bereits vorher Summen bilden... Je nach dem, wie dein Programm grundsätzlich aussieht, kann man entsprechend Vorschläge machen. Ohne Code ist das alles sehr allgemein und es gibt nur wenig, das man sagen kann.

Preallozierst du die Matrix?
Was steht in den Vektoren? Doubles? Ints? Kann man das mit uint8 regeln (Vorsicht bei Summen).

Viele Grüße,
Nras.

P.S.: Wie kommst du auf 296GB? Meiner Meinug nach sind das 2000*37000000*8 byte = 2000*37000000*8/1024/1024/1024 GB = 551 GB. Vielleicht irre ich mich auch.
Private Nachricht senden Benutzer-Profile anzeigen
 
Tobias14
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 15.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2014, 12:18     Titel:
  Antworten mit Zitat      
Hallo Nras,

danke für die schnelle Antwort.
Die 296 GB mit 'single' also *4 statt *8 allerdings habe ich auch /10^9 statt jeweils durch 1024 gerechnet Wink... war auch lediglich zu Abschätzung des Ganzen.


Den Code kann ich kurz darstellen
Ich habe eine Matrix a in welcher ich für mich relevante Kombinationen bilde. A besteht aus 2 Spalten und den bereits genannten 37,000,000 Zeilen. z.B.
1 2
1 3
1 4 ... usw

Aus meiner Datenmatrix M (2000xn) extrahiere ich dann jeweils die Spalten welche in der Matix A nummeriert sind (z.B. zuerst Spalte 1 und Spalte 2, im nächsten Durchlauf Spalte 1 und Spalte 3 usw...).


Code:

M; %Rohdaten
a;  %relevante Kombinationen

Matrix=zeros(length(M),length(a)); % Preallocation

for i=1:length(a)

S1=M(:,a(i,1)); % Also jeweils ein Vektor mit Länge 2000
S2=M(:,a(i,2));

% bisher hab ich das Ganze dann eben in eine Matrix übertragen

Matrix(:,i)=(S1>0 & S2>0) % Hier sind also nur logische Werte

end

Sum_all=sum(Matrix,2);

 


So klappt das ganz gut für kleinerer Matrizen, sobald ich jedoch mehr Kombinationen anwenden möchte (wie im Bsp 37,000,000) bekommen ich logischerweise Probleme damit. Im Prinzip reicht mit zum Schluss die Summe der 37,000,000 Spalten was dann eben einen 2,000-Vektor ergibt.

Also wäre eine gute Lösung:

-Mit for-Schleife Matrix(:,i) so weit generieren wie es der Arbeitsspeicher erlaubt
- Jeweils die Zeilen-Summe bilden und den Vektor speichern
- clear und for-schleife weiterführen ...
- Zum Schluss die Zeilensumme der einzelnen generierten Vektoren bilden?

Viele Grüße
Tobias
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 15.12.2014, 12:50     Titel:
  Antworten mit Zitat      
Hallo,

zunächst ein Kommentar: Vorsicht beim length()-Befehl auf einer Matrix, das macht vielleicht nicht das, was du möchtest.

Ich denke, die Lösung für dein Problem kann sein, einfach direkt nur die Summe zu speichern und nicht die ganze Matrix:

Code:
M = rand(5,4)-0.2; %Rohdaten
a = [1, 2;
     1, 3;
     1, 4
     2, 3];  %relevante Kombinationen

Matrix=zeros(length(M),length(a)); % Preallocation
Sum_all2 = zeros(length(M), 1); % nur eine Spalte mit Nullen

for i=1:length(a)

    S1=M(:,a(i,1)); % Also jeweils ein Vektor mit Länge 2000
    S2=M(:,a(i,2));

    % bisher hab ich das Ganze dann eben in eine Matrix übertragen

    Matrix(:,i)=(S1>0 & S2>0); % Hier sind also nur logische Werte
    Sum_all2 = Sum_all2 + (S1>0 & S2>0); % Nur die Summe merken

end

Sum_all=sum(Matrix,2);
all(Sum_all2 == Sum_all)% Kontrolle der Ergebnisse (kommt das gleiche raus?)


Ich habe das ein paar mal ausgeführt und es kommt bei meinen Tests immer das gleiche bei beiden Variante raus. Vielleicht hilft dir das ja.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Tobias14
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 15.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2014, 13:09     Titel:
  Antworten mit Zitat      
Vielen Dank für den Lösungsvorschlag. Ich denke das Problem sollte damit gelöst sein.
Warum macht der length()-Befehl evtl. nicht das was ich möchte? Was wäre die alternative?
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 15.12.2014, 13:23     Titel:
  Antworten mit Zitat      
Freut mich.

Hier ein kurzes Beispiel zu length() vs size() von Matrizen:
Code:
>> length(zeros(3,4))

ans =

     4

>> size(zeros(3,4))

ans =

     3     4

>> length(zeros(4,3))

ans =

     4

>> size(zeros(4,3))

ans =

     4     3

>> length(zeros(3,4,5))

ans =

     5

>> size(zeros(3,4,5))

ans =

     3     4     5


length() gibt also immer die größte Ausdehnung zurück, während dessen dir size() die Ausdehnung pro Dimension zurückgibt.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Tobias14
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 15.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2014, 13:34     Titel:
  Antworten mit Zitat      
Danke für die Anmerkung. Ich hatte bisher immer Matrizen bei denen die Zeilenzahl deutlich höher als die Spaltenzahl war. Somit hat das bisher keine Probleme gemacht.

Ich werde dann wohl besser
Code:

[LenghtM, WidthM]=size(M);
 

verwenden um unabhängig von den Dimensionen keine Probleme zu bekommen.

Viele Grüße
Tobias
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.