|
|
Speicherproblem bei Operationen auf sehr großen Matrizen |
|
FrankTank3000 |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 31.10.2013, 09:05
Titel: Speicherproblem bei Operationen auf sehr großen Matrizen
|
|
|
|
|
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
|
|
Beiträge: 320
|
|
|
|
Anmeldedatum: 14.12.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
|
|
|
|
|
|
Verfasst am: 31.10.2013, 09:31
Titel: Re: Speicherproblem bei Operationen auf sehr großen Matrize
|
|
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
entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 31.10.2013, 10:34
Titel:
|
|
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
|
|
|
FrankTank3000 |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 31.10.2013, 11:04
Titel:
|
|
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
|
|
Beiträge: 320
|
|
|
|
Anmeldedatum: 14.12.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
|
|
|
|
|
|
Verfasst am: 31.10.2013, 11:30
Titel:
|
|
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
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
entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|