<div><p>Hi Patrick, I just read your mail and one thing came to my mind. Swap, clear,resize may not reduce the capacity which is what std::vector allocates. Please try setting capacity explicitly and dont use swap unless you can give a substantial reason and report back. I couldnt test myself.<br/><br/><font color ="#888888"><p><font color ="#888888">Sent from my android device.</font></p>
</font></p>
<br/><br/>-----Original Message-----<br/>From: Patrick Oesterling &lt;oesterling@informatik.uni-leipzig.de&gt;<br/>To: openwalnut-dev@lists.informatik.uni-leipzig.de<br/>Sent: Fri, 22 Jun 2012 16:03<br/>Subject: [OpenWalnut-Dev] mystisches Speicherproblem<br/><br/></div><p>Hallo OW-Developer,&#13;<br>
&#13;<br>
da es meine erste Nachricht ist, zun&#228;chst ein gro&#223;es Lob an alle &#13;<br>
Verantwortlichen, die OW in seinen heutigen Zustand gebracht haben. Es &#13;<br>
macht mir gewisserma&#223;en "Spa&#223;", meine bisherige Arbeit damit zu &#13;<br>
implementieren.&#13;<br>
&#13;<br>
Ich bin leider auf ein ziemlich merkw&#252;rdiges Speicherproblem im OW &#13;<br>
gesto&#223;en, welches dazu f&#252;hrt, dass der RAM &#252;berl&#228;uft (auf allen Rechnern &#13;<br>
die ich getestet habe). Da ich mit Sebastian bereits vergeblich eine &#13;<br>
ganze Menge Zeit investiert habe, hoffe ich nun, dass evtl von euch &#13;<br>
jemand eine Ahnung/Idee hat, was genau hier (theoretisch) "schief" l&#228;uft.&#13;<br>
&#13;<br>
&#13;<br>
Auf folgende Weise kann das Szenario schnell und einfach reproduziert &#13;<br>
werden:&#13;<br>
&#13;<br>
&#13;<br>
[ 1) OW auschecken ]&#13;<br>
&#13;<br>
2) als private member im Template-Modul in der WMTemplate.h folgendes &#13;<br>
deklarieren&#13;<br>
&#13;<br>
std::vector&lt; std::vector&lt; double &gt; &gt; m_matrix;&#13;<br>
&#13;<br>
3) in der moduleMain() in der WMTemplate.cpp beim m_aTrigger event (ca. &#13;<br>
line: 629) folgendes einf&#252;gen&#13;<br>
&#13;<br>
int size = 0;&#13;<br>
std::cin &gt;&gt; size;&#13;<br>
&#13;<br>
// free old matrix ( just to be sure )&#13;<br>
m_matrix.clear();&#13;<br>
m_matrix.resize( 0 );&#13;<br>
std::vector&lt; std::vector&lt; double &gt; &gt;().swap( m_matrix );&#13;<br>
m_matrix = std::vector&lt; std::vector&lt; double &gt; &gt;();&#13;<br>
&#13;<br>
// allocate new (triangle) matrix&#13;<br>
for( int i = 0; i &lt; size; ++i )&#13;<br>
&nbsp;&nbsp;&nbsp;&nbsp; m_matrix.push_back( std::vector&lt; double &gt;( i + 1, 0.0 ) );&#13;<br>
&#13;<br>
4) OW starten - trigger ausl&#246;sen - <a href="tel:30000">30000</a> eingeben&#13;<br>
&#13;<br>
5) mit "top" (linux command) oder "gnome-system-monitor" beobachten, wie &#13;<br>
der RAM um ca. 4 GB steigt&#13;<br>
&#13;<br>
jetzt zum Problem:&#13;<br>
&#13;<br>
6) trigger erneut ausl&#246;sen - 30 (oder irgendwas &lt;&lt; <a href="tel:30000">30000</a>) eingeben und &#13;<br>
beobachten, wie der Speicher der member variablen -NICHT- komplett &#13;<br>
wieder freigegeben wird.&#13;<br>
&#13;<br>
Scheinbar willk&#252;rlich wird von den 4GB mal mehr oder weniger (laut &#13;<br>
"top") wieder freigegeben, oder leider auch mal gar nichts. Richtig &#13;<br>
unangenehm wird die Geschichte, weil nach mehrmaligen Ausl&#246;sen des &#13;<br>
Triggers sogar ein Vielfaches des Speichers belegt wird (bis der RAM &#13;<br>
halt voll ist) ( -&gt; einfach zweimal mit halber RAM-Gr&#246;&#223;e ausl&#246;sen, um es &#13;<br>
zu beschleunigen).&#13;<br>
&#13;<br>
Dass "top" etwas falsches anzeigt, scheidet meiner Meinung nach aus, &#13;<br>
weil a.) letztendlich tats&#228;chlich geswapt wird (obwohl es nur eine &#13;<br>
Instanz geben sollte) und weil b.) folgender "helloWorld" Ansatz &#13;<br>
einwandfrei funktioniert (laut "top"):&#13;<br>
&#13;<br>
---------------------------&#13;<br>
&#13;<br>
#include &lt;iostream&gt;&#13;<br>
#include &lt;vector&gt;&#13;<br>
&#13;<br>
int main()&#13;<br>
{&#13;<br>
&nbsp;&nbsp; std::vector&lt; std::vector&lt; double &gt; &gt; matrix;&#13;<br>
&#13;<br>
&nbsp;&nbsp; int size = 0;&#13;<br>
&nbsp;&nbsp; while( true)&#13;<br>
&nbsp;&nbsp; {&#13;<br>
&nbsp;&nbsp;&nbsp;&nbsp; std::cin &gt;&gt; size;&#13;<br>
&#13;<br>
&nbsp;&nbsp;&nbsp;&nbsp; if( size == 0)&#13;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;&#13;<br>
&#13;<br>
&nbsp;&nbsp;&nbsp;&nbsp; // free matrix&#13;<br>
&nbsp;&nbsp;&nbsp;&nbsp; std::vector&lt; std::vector &lt; double &gt; &gt;().swap( matrix );&#13;<br>
&#13;<br>
&nbsp;&nbsp;&nbsp;&nbsp; // allocate matrix&#13;<br>
&nbsp;&nbsp;&nbsp;&nbsp; for( int i = 0; i &lt; size; ++i )&#13;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; matrix.push_back( std::vector&lt; double &gt;( i+1, 0.0 ) );&#13;<br>
&nbsp;&nbsp; }&#13;<br>
}&#13;<br>
&#13;<br>
---------------------------&#13;<br>
&#13;<br>
Falls einer von euch eine Ahnung hat, was im OW (threading, libraries, &#13;<br>
etc) daf&#252;r verantwortlich sein k&#246;nnte, oder ob hier prinzipielle Dinge &#13;<br>
verantwortlich sind, w&#228;re ich sehr dankbar. Angeblich existiert auch nur &#13;<br>
immer eine Instanz eines Moduls (hier: des Template Moduls).&#13;<br>
&#13;<br>
&#13;<br>
Folgendes habe ich au&#223;erdem probiert:&#13;<br>
&#13;<br>
1.) alle Einzelf&#228;lle bei "free memory" (siehe oben)&#13;<br>
2.) boost::shared_ptr&lt; std::vector&lt; std::vector&lt; double &gt; &gt; &gt; m_matrix&#13;<br>
3.) helloWorld Ansatz mit Klassen-member und boost::threads ( "top" &#13;<br>
zeigt weiterhin korrekt an)&#13;<br>
4.) helloWorld Ansatz mit Klassen-member und Funktionalit&#228;t in extra &#13;<br>
library ( "top" zeigt weiterhin korrekt an)&#13;<br>
&#13;<br>
&#13;<br>
Vielen Dank schonmal.&#13;<br>
Patrick&#13;<br>
_______________________________________________&#13;<br>
OpenWalnut-Dev mailing list&#13;<br>
<a href="mailto:OpenWalnut-Dev@lists.informatik.uni-leipzig.de">OpenWalnut-Dev@lists.informatik.uni-leipzig.de</a>&#13;<br>
<a href="http://lists.informatik.uni-leipzig.de/mailman/listinfo/openwalnut-dev">http://lists.informatik.uni-leipzig.de/mailman/listinfo/openwalnut-dev</a>&#13;<br>
&#13;<br>
Archive: <a href="http://lists.informatik.uni-leipzig.de/pipermail/openwalnut-dev">http://lists.informatik.uni-leipzig.de/pipermail/openwalnut-dev</a>/&#13;<br>
&#13;<br>
</p>