|
Platin |

Forum-Century
|
 |
Beiträge: 174
|
 |
|
 |
Anmeldedatum: 07.06.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 24.01.2011, 18:36
Titel: Variablen vorbelegen
|
 |
Hey an Alle,
Ich habe das Problem das mein Code anscheinend so ineffektiv geschrieben ist, das mein rechner out-of Memory läuft.
Nun versuche ich meinen code zu verbessern, indem ich Fehlernachrichten wie z.B:
''Y'' might be growing inside a loop. Consider preallocating for speed.
Das ich sehr viele von diesen Schleifen habe, könnte das vllt mein Speicherproblem lösen, oder was meint ihr?
Macht das mein code blos schneller oder spart das auch speicher?
Also hier wäre meine Schleife die ich zu verbessern habe:
Ich weiß wie groß Y wird. Y wird ein 1X50 Vektor. Mein Vorschlag wäre folgender:
Jetzt habe ich ja eigentlich die Variable vordefiniert. Mein ihr das läuft so? Ich will es nicht unbedingt vorher ausprobieren, da wie gesagt, mein recnhner out-of memory läuft und dass dauert ne weile.
grüße
|
|
|
|
|
Andreas Goser |

Forum-Meister
|
 |
Beiträge: 3.654
|
 |
|
 |
Anmeldedatum: 04.12.08
|
 |
|
 |
Wohnort: Ismaning
|
 |
|
 |
Version: 1.0
|
 |
|
|
 |
|
Verfasst am: 24.01.2011, 18:41
Titel:
|
 |
Bis auf, dass in ZEROS ein Tippfehler ist würde ich das genauso machen. Und ich würde zum Testen erstmal mit 2-5 Elemente statt mit 50 anfangen und mir Speicherverbrauch, Performance (Profiler) und M-Lint anschauen.
Andreas
|
|
|
TH |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 24.01.2011, 18:42
Titel:
|
 |
Eigentlich nicht.
Das Vorbelegen macht man, weil sonst MAtlab ständig das Array erweitern muss, was es ausbremst (Consider preallocating for speed)
Du wirst dir den Speicher sonst wie vollmachen
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 24.01.2011, 19:35
Titel: Re: Variablen vorbelegen
|
 |
|
 |
|
Hallo Platin,
Das bringt für die Speichernutzung leider gar nichts! Im Gegenteil.
Zwar hast Du den Vector Y vorbelegt, aber die Zeile "Y=[index0 rr];" überschreibt ihn einfach. Im Endeffekt hast du damit T Arrays belegt! Zwar wird jedesmal der Speicher wieder freigegeben, aber das führt dennoch zur Fragmentierung des Speichers. Das bedeutet, dass man zwar theoretisch den Speicher wieer benutzen kann, praktisch muss aber das Betriebssystem und/oder Matlab den Speicher aber erst wieder säubern und mit Nullen überschreiben (macht Matlab tatsächlich, leider).
Wenn ich es richtig verstehe, ist der Vector "[index0, rr]" 50 Elemente groß. Den Speicher von Y könntest Du dann recyclen:
Damit wird der neue Vektor in den existierenden Speicher einkopiert. Es sieht aber so aus, als sei "index0" konstant! Dann wäre dies viel effizienter:
Das ist viel besser, da nun folgendes entfällt:
1. Vektor [index0, rr] erzeugen.
2. Testen, ob Vektor Y ausreichend groß ist, um den temporärern Vektor aufzunehmen.
3. Werte des Vektors in Y kopieren.
4. Speicher für den temporären Vektor wieder freigeben.
Nun hätte ich noch folgenden Ideen:
"char(name{rr})": Bist Du sicher dass "name{rr}" nicht schon ein CHAR-Vector ist? Dann kann nämlich CHAR entfallen.
Ausserdem funktioniert REGEXP auch mit einem CELL STRING, allerdings deutlich schneller als auf den einzelnen Strings.
Ob Dir eine Pre-allocierung etwas bringt, kannst Du mit "feature('memstats')" untersuchen (läuft leider nicht mit allen Matlab-Versionen): Damit wird im Command-Window auch die Speicher-Adresse der Arrays angezeigt. Wenn sich ein Vektor immer an der gleichen Adresse befindet, funktioniert die Pre-allocierung offenbar.
Gruß, Jan
|
|
|
Scriptor |

Forum-Century
|
 |
Beiträge: 217
|
 |
|
 |
Anmeldedatum: 22.02.08
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 24.01.2011, 20:37
Titel:
|
 |
Du darfst keine Reihe in die Zeros Funktion übergeben. Wenn du einen 50 Elemente großen Vektor preallokieren willst, dann musst du es folgendermaßen anstellen:
vector50 = zeros(1,50);
kein Doppelpunkt nur Kommas. Da müsste das Memoryproblem herkommen.
Grüße
|
|
|
Andreas Goser |

Forum-Meister
|
 |
Beiträge: 3.654
|
 |
|
 |
Anmeldedatum: 04.12.08
|
 |
|
 |
Wohnort: Ismaning
|
 |
|
 |
Version: 1.0
|
 |
|
|
 |
|
Verfasst am: 24.01.2011, 20:41
Titel:
|
 |
Ein Lob an Jan der genauer hin geschaut hat.
Andreas
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 24.01.2011, 21:06
Titel:
|
 |
Und ein Lob an Scriptor, der noch genauer hingeschaut hat!
"zeros(1:50)" bedeutet ja "zeros(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50)". Das ist natürlich ein ganz schöner Brocken. Aber dank der eleganten Matlab-Syntax kann man so einen langen Vektor leicht übersehen.
Gruß, Jan
|
|
|
Platin |
Themenstarter

Forum-Century
|
 |
Beiträge: 174
|
 |
|
 |
Anmeldedatum: 07.06.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 25.01.2011, 11:18
Titel:
|
 |
Hey ich danke euch für die zahlreichen Antworten.
Ich habe geschusselt. index= gibt es nicht! Bin ein wenig hin und her gesprungen mit den Variablen.
Der richtige Code wäre folgendender:
Ändert das was?
Grüße
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 25.01.2011, 11:37
Titel:
|
 |
Hallo,
eine entscheidende Frage wird sein: wie groß ist T?
Wenn, dann wäre eine Vorbelegung mit etwas wie
wohl sinnvoll.
Im übrigen scheint es mir, dass sich hier auch cellfun schön anwenden ließe, um die for-Schleife loszuwerden.
Grüße,
Harald
P.S.: Bitte darauf achten, dass die Frage korrekt gestellt ist. Ist ja doof, wenn reihenweise Antworten auf die falsche Frage kommen.
|
|
|
Platin |
Themenstarter

Forum-Century
|
 |
Beiträge: 174
|
 |
|
 |
Anmeldedatum: 07.06.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 25.01.2011, 14:10
Titel:
|
 |
Hey,
danke für deine Antwort.
Ja sorry, habe ich zu spät gesehen.
T ist sehr groß. Kann werte bis 500 annehmen.
Spielt das eine Rolle ?
Grüße
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 25.01.2011, 14:26
Titel:
|
 |
Hallo,
je größer T ist, desto größer ist die Rolle, die das spielt.
Im Zweifel hilft ausprobieren:
In deinem Fall ist das Problem, dass du nicht vorab weißt, wie groß Y werden wird. Du kannst dir natürlich den maximal benötigten Speicher holen und den Rest dann wieder freigeben.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
Platin |
Themenstarter

Forum-Century
|
 |
Beiträge: 174
|
 |
|
 |
Anmeldedatum: 07.06.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 25.01.2011, 14:35
Titel:
|
 |
Hey, danke für die antwort.
also ich habe ja viele solcher Schleifen, und in den meisten weiß ich wie groß Y wird. eigentlich müsste ich Y ja dann vorbelegen können.
Das würde doch dann Speicher sparen, oder ?
Grüße
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 25.01.2011, 14:51
Titel:
|
 |
Hallo,
nicht sparen, aber effizienter nutzen.
Out of memory - Probleme werden dadurch aber in der Regel nicht gelöst. Vielleicht solltest du die Grundstruktur deines Programmes überdenken, insbesondere: benötigst du letztlich die Gesamtmenge der Daten, die du generierst?
Vielleicht kannst du das ganze ja mal mit kleineren Variablen / Anzahlen an Iterationen laufen lassen und dir im Workspace bzw. mit whos anschauen, welche Variablen wie groß werden.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
Platin |
Themenstarter

Forum-Century
|
 |
Beiträge: 174
|
 |
|
 |
Anmeldedatum: 07.06.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 26.01.2011, 14:06
Titel:
|
 |
Hey Harald,
nagut, wenn dass mein Out-of-Memory Problem nicht löst dann bringt mir das nichts. Ja, die Sache ist die dass ich an dem Code ein paar Monate geschrieben habe und nun keine Zeit mehr habe weiter daran zu arbeiten, weil sonst hätte ich die daten auch genauso gut im Excel auswerten können. Ich denke die schnellste Methode ist das ich einfach mal versuche mehr Speicher frei zu geben. Ich weiß dass es immer besser ist den code effizienter zu schreiben, aber mir fehlt einfach die Zeit.
Trotzdem danke euch für die Hilfe.
Grüße
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 26.01.2011, 14:34
Titel:
|
 |
Hallo,
es kann unter Umständen das Out-Of-Memory - Problem lösen, aber ich halte es für nicht sehr wahrscheinlich.
Die Überlegung ist vor allem: musst du wirklich alles berechnen, was du berechnest?
Lass mal
laufen, um zu sehen, wieviel Speicher du hast brauchst.
Zitat: |
weil sonst hätte ich die daten auch genauso gut im Excel auswerten können |
Glaub mir: bei Excel stößt du wesentlich schneller an Grenzen, was große Datenmengen angeht. Vor allem wird es dann unerträglich langsam.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
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 - 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.
|
|