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

Speicherproblem bei Operationen auf sehr großen Matrizen

 

FrankTank3000

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.10.2013, 10:05     Titel: Speicherproblem bei Operationen auf sehr großen Matrizen
  Antworten mit Zitat      
Hallo allerseits!

Ich habe ein "kleines" Problem mit meiner Speicherauslastung. Es geht um folgendes:

Ich möchte Messdaten auswerten. Dazu lese ich aus einer Datei eine sehr große Datenmatrix [6331x16384] (~800 MB), es können aber auch bis zu 1,4 GB sein. Das Problem ist nun, dass ich, sobald ich auch nur eine einzige Operation auf diese Matrix anwende (z.B. abs() oder real()), den Speicher sprenge und Matlab mit OUT OF MEMORY abbricht.

Das m-file soll auf Uni-Rechnern verwendet werden, auf denen MatlabR2011b (32-bit) läuft und ~2 GB Arbeitsspeicher zur Verfügung hat, deswegen ist "Umsteigen auf 64-bit und mehr RAM" leider keine Option.

Ich habe schon überlegt, ob ich die Operatoren Zeilenweise anwende und die alte Matrix dann ebenfalls Zeilenweise lösche. Ich befürchte jedoch, dass würde den Code extrem langsam machen (for Schleife).

Hat jemand Ideen oder Anregungen wie sich dieses Problem lösen liesse?

Danke schonmal im voraus,
mfg FrankTank


markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 31.10.2013, 10:31     Titel: Re: Speicherproblem bei Operationen auf sehr großen Matrize
  Antworten mit Zitat      
FrankTank3000 hat Folgendes geschrieben:

Ich möchte Messdaten auswerten. Dazu lese ich aus einer Datei eine sehr große Datenmatrix [6331x16384] (~800 MB), es können aber auch bis zu 1,4 GB sein. Das Problem ist nun, dass ich, sobald ich auch nur eine einzige Operation auf diese Matrix anwende (z.B. abs() oder real()), den Speicher sprenge und Matlab mit OUT OF MEMORY abbricht.

Das m-file soll auf Uni-Rechnern verwendet werden, auf denen MatlabR2011b (32-bit) läuft und ~2 GB Arbeitsspeicher zur Verfügung hat, deswegen ist "Umsteigen auf 64-bit und mehr RAM" leider keine Option.

Also wenn du nicht mehr als 2GB Arbeitsspeicher zur Verfügung haben wirst, solltest du die Datei splitten. Z.b. immer nur mit 630 Zeilen im Speicher Arbeiten.
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.10.2013, 11:34     Titel:
  Antworten mit Zitat      
Hallo,

In Ergänzung dessen:
Falls Spalten Variablen entsprechen und nicht alle Variablen benötigt werden, selektiv einlesen.
Aus den einzelnen Blöcken der Datei nur die relevanten Informationen extrahieren, die z.B. zum Erstellen einer Grafik oder zum Erstellen eines Berichts benötigt werden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
FrankTank3000

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.10.2013, 12:04     Titel:
  Antworten mit Zitat      
Hallo!

Das mit dem Aufteilen der Matrix wäre eine Option, wenngleich halt ein bischen fummelig. Aber danke für die Anregung!

Das Problem beim "nur relevante Zeilten/Spalten" einlesen ist, dass die Datenmatrix von einer (mir unzugänglichen) ActiveX Schnittstelle aus einer Datei extrahiert wird. Ich gebe Dateiname und Pfad an und bekomme eine dicke Datenmatrix zurück in den workspace. Damit muss ich dann weiterarbeiten.
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 31.10.2013, 12:30     Titel:
  Antworten mit Zitat      
FrankTank3000 hat Folgendes geschrieben:
Hallo!

Das mit dem Aufteilen der Matrix wäre eine Option, wenngleich halt ein bischen fummelig. Aber danke für die Anregung!


Das kommt ganz auf dein Betriebssystem und das Dateiformat an.
Mit Linux und einer csv Datei hast du ganz einfaches spiel

Code:

split -l 630 data.csv data-split
 

In der Bash. Erzeugt dir 11 data_split* Dateien mit je 630 Zeilen (bei insgesamt 6331 Zeilen).

Aber unter Windows und mit xlsx als Dateiformat - ja, das wird fummeliger, aber nicht unmöglich (xlsx Dateien kann man unzippen. Die implementation wird vermutlich zeitaufwändiger, kann sich aber positiv auf die Laufzeit auswirken wenn es sehr oft wiederholt werden muss).
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
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 - 2024 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.