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