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

große mat datei-->nur bestimmte vektoren nötig

 

xPashAx
Forum-Guru

Forum-Guru


Beiträge: 294
Anmeldedatum: 18.05.09
Wohnort: Heidelberg
Version: ---
     Beitrag Verfasst am: 07.05.2010, 09:30     Titel: große mat datei-->nur bestimmte vektoren nötig
  Antworten mit Zitat      
hi leute,
ich hab ne große mat datei, sprich 1 bis 2 GB.
ich brauche aber nur bestimmte vektoren von der datei.
sooo muss man zuerst die ganze mat datei laden oder kann man auch nur die bestimmten vektoren ins workspace laden(also aus einer mat datei).
... und noch ne frage wie kann ich meinen speicher platz schonen.
hab gelesen das
Code:
nicht so effektiv sein soll.


ich bedank misch schon vorraus.
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 07.05.2010, 09:48     Titel:
  Antworten mit Zitat      
Hallo

du kannst auch nur bestimmte Variablen aus MAT-File laden

z.B mein MAT-File hat Var1 ,Var2, Var3
Code:


load('mymat.mat', 'Var1', 'Var3')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
xPashAx
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 294
Anmeldedatum: 18.05.09
Wohnort: Heidelberg
Version: ---
     Beitrag Verfasst am: 07.05.2010, 10:09     Titel:
  Antworten mit Zitat      
heisst das dann ich schone so mein speicher???
... und denny noch ne simple frage.
Code:

tgesMod=tges(tges>=tmaxAnfang & tges<=tminEnde);

tgesMod=tgesMod(1):0.02:tges(end)


so wenn ich tgesMod so überschreibe spart man so auchn speicher oder wird mal tgesMod wie oben und tgesMod wie unten virtuell gespeichert.
Private Nachricht senden Benutzer-Profile anzeigen
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 07.05.2010, 11:13     Titel:
  Antworten mit Zitat      
Hallo,

tgesMod ist eine eigene Variable und teilt sich keinen Speicherplatz mit tges. Ist denn tges so groß, dass Du Dir darüber Sorgen machst? Dann könntest Du natürlich auch sowas machen:
Code:
tStart = tges(find(tges>=tmaxAnfang, 1, 'first'));
tEnd = tges(find(tges<=tminEnde, 1, 'last'));
tgesMod = tStart:0.02:tEnd;
 


Ciao,
Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 07.05.2010, 11:33     Titel:
  Antworten mit Zitat      
Es gibt dafür keine Garantie, das Problem ist dass Matlab packt die Daten in MAT-Files um bis zu 8 Fache ihrer tatsächlicher Größe. Das ist schön und gut für die Festplatte, aber nicht für den Arbeitsspeicher. Da beim Laden wird es ja in Hauptspeicher versucht zu entpacken. Das reserviert von Unmengen von Speicher. Aber erst bei großen Datenmengen merkt man wirklich diesen Effekt.

Also große MAT-Files möglichst mit Option -v6 abspeichern, also unkomprimiert.

Zitat:


tgesMod=tges(tges>=tmaxAnfang & tges<=tminEnde);

tgesMod=tgesMod(1):0.02:tges(end)


so wenn ich tgesMod so überschreibe spart man so auch Speicher oder wird mal tgesMod wie oben und tgesMod wie unten virtuell gespeichert.


Es hängt davon ab, ob du es tgesMod anderer Variable vor dem Überschreiben zuweist, dann wird Kopie erstellt, ansonsten wird komplett überschrieben. Natürlich Größe hängt auch von Datentyp double ist 2 Mal so groß wie integer
Private Nachricht senden Benutzer-Profile anzeigen
 
xPashAx
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 294
Anmeldedatum: 18.05.09
Wohnort: Heidelberg
Version: ---
     Beitrag Verfasst am: 07.05.2010, 12:22     Titel:
  Antworten mit Zitat      
meine frage ist eigentlich :
ich lade einen vektor die 100mb ist danach tu ich sie mit einem vektor überschreiben die 10mb ist.
meine frage ist hab ich nun die 90 mb zur verfügung oder ist die 100mb komplett weg?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 07.05.2010, 12:48     Titel:
  Antworten mit Zitat      
Hallo

das kannst du doch selbst ausprobieren

Code:


Ich poste gleich mal mal das Ergebnis,

vor dem Belegen habe ich 2317MB Speicher zu Verfügung
dann 100 MB belegt, bleibt 2221MB Speicher zu Verfügung
dann überschreibe mit 10 MB 2307MB Speicher zu Verfügung

Also daraus folgt: ja es werden 90 MB wieder frei.


Zitat:

VOR DEM BELEGEN:

Memory available for all arrays: 2317 MB (2.429e+009 bytes) **
Memory used by MATLAB: 450 MB (4.714e+008 bytes)

100 MB BELEGT:

Name Size Bytes Class Attributes

A 1x12500000 100000000 double

Memory available for all arrays: 2221 MB (2.329e+009 bytes) **
Memory used by MATLAB: 545 MB (5.714e+008 bytes)

MIT 10MB ÜBERSCHRIEBEN:

Name Size Bytes Class Attributes

A 1x1250000 10000000 double

Memory available for all arrays: 2307 MB (2.419e+009 bytes) **
Memory used by MATLAB: 459 MB (4.814e+008 bytes)

Private Nachricht senden Benutzer-Profile anzeigen
 
xPashAx
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 294
Anmeldedatum: 18.05.09
Wohnort: Heidelberg
Version: ---
     Beitrag Verfasst am: 07.05.2010, 12:59     Titel:
  Antworten mit Zitat      
vielen dank denny warst ne große hilfe.
...und was kannst du über
[/code]
pack
[code]
sagen.
in einem beitrag haste geschrieben das es doch net so nützlich ist, soweit ich es weiss.

ciao
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 07.05.2010, 13:59     Titel:
  Antworten mit Zitat      
Die Idee hinter PACK ist gut, da aber es nur aus Workspace aufrufbar ist, finde ich in diesen Befehl nutzlos.

Der Befehl sollte den Speicher wieder kompakter schreiben.
Also man hat den Speicher mit mehreren Variablen belegt, dann löscht man
einige dann belegt man wieder. Irgendwann entstehen Zellen in Speicher die zwar frei sind, werden aber nicht belegt weil zusammenhängender Speicher wird gesucht.
Also nimmt man PACK, der schreibt alle Variablen in Datei, dann löscht komplett den Speicher und dann werden die Variablen wieder nachgeladen und in Speicher nach einander geschrieben. Danach hat man wieder größeren zusammenhängenden Speicher

Eigentlich ist der Prinzip von PACK wie folgt:
Code:

save temp.mat
clear all
load temp.mat
 
Private Nachricht senden Benutzer-Profile anzeigen
 
xPashAx
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 294
Anmeldedatum: 18.05.09
Wohnort: Heidelberg
Version: ---
     Beitrag Verfasst am: 07.05.2010, 14:11     Titel:
  Antworten mit Zitat      
sorry denny ist immer noch net klar.
nehmen wir an ich hab daten1.mat geladen.
jetzt ist der ganze inhalt im workspace.
was passiert wenn ich jetzt
Code:
eingebe ? mein workspace ist ja immer noch voll soweit ich es sehe.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 07.05.2010, 14:35     Titel:
  Antworten mit Zitat      
Code:

pack daten1.mat
 


Es werden Temporär alle Variablen in File daten1.mat, Speicher wird geleert und dann werden die Variablen zurückgeladen. Dieses Mal werden diese aber kompakt geschrieben.
Dadurch wird es nicht mehr freien Speicher, sondern freie Blöcke,welche zusammenhängend sind.

z.B das ist mein Speicher 3 Einzelblöcke
|voll|voll|leer|voll|voll|leer|voll|leer|

Ich will es mit Variable belegen dass 2 Blöcke groß ist, es gibt aber keine Blöcke die nebeneinander frei sind(zusammenhängende Blöcke).
=> Out of Memory

nach pack, bekomme ich 3 Zusammenhängende Blöcke
also kann mit Variablen die 2 Blöcke groß ist den Speicher belegen.

|voll|voll|voll|voll|voll|leer|leer|leer

lese doch Dokumentation zu PACK, da steht doch alles
Code:


Zuletzt bearbeitet von denny am 07.05.2010, 14:47, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
xPashAx
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 294
Anmeldedatum: 18.05.09
Wohnort: Heidelberg
Version: ---
     Beitrag Verfasst am: 07.05.2010, 14:44     Titel:
  Antworten mit Zitat      
jetzt ist es klar danke denny
Private Nachricht senden Benutzer-Profile anzeigen
 
xPashAx
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 294
Anmeldedatum: 18.05.09
Wohnort: Heidelberg
Version: ---
     Beitrag Verfasst am: 07.05.2010, 15:26     Titel:
  Antworten mit Zitat      
noch ne letzte frage. die logik hab ich verstanden.
daten1.mat wird geladen und danach einige variablen gelöscht.
dann reicht es doch nur


Code:

zu schreiben. wieso noch einen filename
Code:


hmm noch was wenn ich zB pack daten2.mat schreibe dann ist ja die daten2.mat nirgendwo zu finden.

heute hab ich wohl euer nerven ziemlich strapaziert :/
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 07.05.2010, 16:25     Titel:
  Antworten mit Zitat      
Zitat:

noch ne letzte frage. die logik hab ich verstanden.
daten1.mat wird geladen und danach einige variablen gelöscht.
dann reicht es doch nur PACK zu schreiben. wieso noch einen filename

Muss man nicht es reicht in der Tat nur PACK zu schreiben.
Der Name wird dann automatisch generiert. Wozu es gut ist, kann ich nicht beantworten.

Zitat:

hmm noch was wenn ich zB pack daten2.mat schreibe dann ist ja die daten2.mat nirgendwo zu finden.

Obwohl in der Hilfe steht, dass PACK in Aktuellen Verzeichnis schreibt, stimmt es in Wirklichkeit nicht mehr, es wird in Temporären Ordner kurzzeitig gespeichert.
Code:

% so schreibt erst PACK in aktuellen Verzeichnis
pack(fullfile(pwd,'temp.mat'))
 

Achtung: Es wird nur KURZZEITIG gespeichert, also am Ende der Bearbeitungskette wird die Datei wieder gelöscht.
(MAT Speichern-> Memory leeren-> MAT Laden->MAT Löschen)


Den Temporären Verzeichnis findet man über TEMPDIR
Code:


Du kannst dir auch diesen Prozess in Windows Task Manager beobachten:

1) Öffne Task-Manager auf Reiter Systemleistung
2) jetzt in Matlab Konsole folgendes eingeben:
Code:

B= zeros(1,10^8);
pack
 


Dann siehst du kurzzeitigen Sprung von Speicher nach unten, wo es geleert war und dann wieder nach oben, wo MAT-Datei wieder geladen wurde

Viel Spaß
Private Nachricht senden Benutzer-Profile anzeigen
 
xPashAx
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 294
Anmeldedatum: 18.05.09
Wohnort: Heidelberg
Version: ---
     Beitrag Verfasst am: 07.05.2010, 18:31     Titel:
  Antworten mit Zitat      
super denny vielen dank für die ziemlich ausführliche erklärung.

...schönes wochende Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.