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