Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  VBA: Speicherbedarf zügeln

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  VBA: Speicherbedarf zügeln (2870 mal gelesen)
gdir
Mitglied



Sehen Sie sich das Profil von gdir an!   Senden Sie eine Private Message an gdir  Schreiben Sie einen Gästebucheintrag für gdir

Beiträge: 157
Registriert: 25.06.2003

erstellt am: 07. Jun. 2004 11:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo,

ich habe Probleme mit dem Speicherbedarf eines größeren CATVBA-Makros. Das Makro enthält einen Interpolationsalgorithmus, in dem nach und nach einige tausend GSD-Drahtelemente (Intersection, Point, Near, Line, etc.) erzeugt werden. Zur Laufzeit existieren ca. 100 Elemente davon gleichzeitig. Anschließend werden sie bis auf eines wieder gelöscht und die Interpolation beginnt an der nächsten Stelle.

Obwohl ich die Elemente sauber erzeuge und wieder lösche, steigt der Speicherbedarf stetig an. Tests haben ergeben, dass es für den Speicherbedarf keinen Unterschied macht, ob ich die Interpolationselemente lösche oder nicht (lediglich die Dateigröße des Ergebnis-CATParts wird davon beeinflusst). Selbst nach Ende des Makros wird der Speicher nicht freigegeben. Erst das Schließen des CATParts führt zur Freigabe des Speichers.

Hat jemand ähnliche Probleme (oder noch besser eine Lösung)?

Zu den Details:
- CATIA V5 R12 SP06
- Windows XP Prof. SP 01
- Ausschließlich GSD-Elemente
- Alle erzeugten Elemente werden in einen OpenBody gehängt (HybridBody.AppendHybridShape)
- Löschen erfolgt durch HybridShapefactory.DeleteObjectForDatum (unter Berücksichtigung der Parent-Children-Abhängigkeiten)
- Löschen mittels Selection.Delete hatte ich auch probiert. Keine Besserung hinsichtlich des Speicherbedarfs, aber deutlich langsamer als DeleteObjectForDatum
- Nach dem Löschen werden alle Objekte auf Nothing gesetzt
- Der Code ist sinnvoll in Subs strukturiert, (fast) ausschließlich lokale Variablen

Irgendwelche Ideen?

Günther

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

AlfaRomeo75
Mitglied
Dipl.Ing. - Flächenkonstrukteur/Methodenplaner


Sehen Sie sich das Profil von AlfaRomeo75 an!   Senden Sie eine Private Message an AlfaRomeo75  Schreiben Sie einen Gästebucheintrag für AlfaRomeo75

Beiträge: 174
Registriert: 06.12.2004

-----------------
Windows XP professional Version2002
Service Pack 2
-----------------
CATIA V5 R16 SP5
-----------------
Intel Pentium 4 3,4GHz
4 GB RAM
-----------------

erstellt am: 25. Mai. 2007 08:31    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für gdir 10 Unities + Antwort hilfreich

Hallo Günther,
ich weiß das dein Beitrag schon ein paar "Tage" (Jahre) alt ist, nur hatte ich schon des öfteren die gleichen Probleme!
Ich erzeuge Hunderte (manchmal Tausende) von GSD Elementen die ich anschliessend wieder lösche. Es wird das beste Ergebnis gespeichert und mit den Werten anschliessend neu gebaut!
Funktioniert in Probeläufen mit größeren Steps auch prima, nur wenn ich dann den Finalen RUN über Nacht anstarte (theoretische Rechenzeit manchmal 7-10Std.), begrüßt mich mein Rechner lediglich mit:
"Click OK to terminate" 
Ein Blick in den Taskmanager verrät mir: Auslagerungsdatei ca.2GB!
Hast Du mittlerweile eine Lösung für diese Problem gefunden?
Catia ist es ja offensichtlich egal, ob die Elemente gelöscht werden oder nicht. Der Speicher wird nicht mehr freigegeben und so "müllt" sich das Programm zu.
Früher (oh Gott, wie sich das anhört....!) im V4 gab es einen Schalter "EREASE/PACK"! Damit wurde nicht benötigter Speicher wieder freigegeben!
Gibt es soetwas im V5 und falls "Ja", kann ich das auch über eine catvba Makro ansprechen!

------------------
-------------------------------------------------
Gruß,
AlfaRomeo75  

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

qli
Mitglied



Sehen Sie sich das Profil von qli an!   Senden Sie eine Private Message an qli  Schreiben Sie einen Gästebucheintrag für qli

Beiträge: 13
Registriert: 16.04.2007

erstellt am: 25. Mai. 2007 09:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für gdir 10 Unities + Antwort hilfreich

Hi Alfa,

Als ich weiss (und ich habe auch eine weile mich darüber gekümmert und geärgert  ), gibt kein Befehl für Speicher befreien.
Ich habe endlich das Problem gelöst mit schließen und wieder öffnen den Part oder Produkt Dokument. Du muss nur irgendwie eine sichere Grenze abschätzen, wenn dein Speicher noch nicht voll ist (nach wieviele Schleifen? - Ich denke das du irgendwelche Schleife hast die wieder und wieder laufen und die Speicher besetzen), und dann muss du der Part Schließen, wieder Öffnen und Speicher ist frei (das nur wenn du alles sauber gemacht hast und die unnötige Sachen gelöscht 
Und das machst du vieleicht mehrmals (in eine Schleife Do-While oder irgenwas), bis dein MAkro zu Ende ist.

Eine andere Lösung habe ich nirgendwo gefunden - in COE Forum habe auch diese Lösung gefunden, und keine andere.

Endlich ist keine große Problem wenn dein Makro sowieso mehrere Stunden läuft 

Viel spaß!

qli

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

AlfaRomeo75
Mitglied
Dipl.Ing. - Flächenkonstrukteur/Methodenplaner


Sehen Sie sich das Profil von AlfaRomeo75 an!   Senden Sie eine Private Message an AlfaRomeo75  Schreiben Sie einen Gästebucheintrag für AlfaRomeo75

Beiträge: 174
Registriert: 06.12.2004

-----------------
Windows XP professional Version2002
Service Pack 2
-----------------
CATIA V5 R16 SP5
-----------------
Intel Pentium 4 3,4GHz
4 GB RAM
-----------------

erstellt am: 25. Mai. 2007 10:09    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für gdir 10 Unities + Antwort hilfreich

Hallo qli!
Vielen Dank für deine Antwort!
Das mit dem Schließen und öffnen der jeweiligen Parts habe ich mir auch schon überlegt und scheint auch wohl die derzeit einzige Möglichkeit zu sein den Speicher wieder freizugeben!
Allerdings wollte nochmal nachfragen ob es da nicht eine bessere Möglichkeit gibt, da ich es sehr umständlich finde! 
Ausserdem müsste ich erstmal durch Tests herausfinden, wann der Speicher "voll" ist! Aber das ist ja nur eine Frage des "Timings".
Trotzdem nochmal: "thanks4u".


------------------
-------------------------------------------------
Gruß,
AlfaRomeo75  

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

noir333
Mitglied
Ingenieur


Sehen Sie sich das Profil von noir333 an!   Senden Sie eine Private Message an noir333  Schreiben Sie einen Gästebucheintrag für noir333

Beiträge: 148
Registriert: 27.01.2004

Dell Precision 450 Dual Xeon, 2MB RAM,
XP SP2, NX3
V5R17SP3

erstellt am: 26. Mai. 2007 09:41    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für gdir 10 Unities + Antwort hilfreich

Hallo alfa und qli,

ich habe eine Anwendung mit demselben Problem. Zur Freigabe des Speichers starte ich Catia neu. Das Schliessen und Wiederöffnen bringt so gut wie gar nichts (vielleicht 100 MB von 800 MB, die belegt sind).
Habt Ihr einen Tipp?
Ich schliesse mit:

dim mypartdoc as document
Dim documents1 as documents
mypartdoc.close
MyPartDoc = documents1.Open("dateiname")

Vor allem vor dem Hintergrund, dass Catia ja beim Schliessen die Datei gar nicht wirklich "vergisst", sondern immer noch bis zum Neustart im Speicher hält.
Was mache ich falsch?

------------------
-----------

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

noir333
Mitglied
Ingenieur


Sehen Sie sich das Profil von noir333 an!   Senden Sie eine Private Message an noir333  Schreiben Sie einen Gästebucheintrag für noir333

Beiträge: 148
Registriert: 27.01.2004

Dell Precision 450 Dual Xeon, 2MB RAM,
XP SP2, NX3
V5R17SP3

erstellt am: 27. Mai. 2007 18:27    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für gdir 10 Unities + Antwort hilfreich

... ich will dann mal meine eigene Frage beantworten:

also, nach längeren Tests kann man folgendes sagen:
Schließt man eine (oder alle) Dateien in Catia, dann wird der Speicher (angezeigt im Task-Manager) nicht oder nur unwesentlich weniger. Aber öffnet man die Datei wieder und rechnet darin weiter, so kann wohl dergleiche Speicher wiederverwendet werden. Der Speicherbedarf steigt dann nur wenig zusätzlich an.

Die Strategie muss also lauten:
Wenn man viele Elemente erzeugt und zumindest teilweise auch wieder löscht, dann sollte man in kurzen Abständen die Datei Schließen und wieder Öffnen. Das hat dann den Vorteil, dass der Speicher nur sehr langsam "vollläuft". Trotzdem kann es irgendwann dann erforderlich werden Catia neu zu starten, aber man kann so viel länger rechnen. Nebenbei hat das noch den positiven Effekt, dass das Programm viel schneller arbeitet, weil weniger Elemente in der Datei sind. Also nicht unbedingt warten bis der Speicher voll ist, sondern in kurzen Abständen Schließen und Öffnen, um die Größe möglichst klein zu halten. Ich habe in meinem Fall ein Optimum gefunden, dass 5 Minuten ein gutes Intervall ist. Das kann aber natürlich von der Anwendung  und der Dateigröße abhängen.

Habt Ihr ähnliche Erfahrungen gemacht?

Übrigens: V5R16SP8

------------------
-----------

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

AlfaRomeo75
Mitglied
Dipl.Ing. - Flächenkonstrukteur/Methodenplaner


Sehen Sie sich das Profil von AlfaRomeo75 an!   Senden Sie eine Private Message an AlfaRomeo75  Schreiben Sie einen Gästebucheintrag für AlfaRomeo75

Beiträge: 174
Registriert: 06.12.2004

-----------------
Windows XP professional Version2002
Service Pack 2
-----------------
CATIA V5 R16 SP5
-----------------
Intel Pentium 4 3,4GHz
4 GB RAM
-----------------

erstellt am: 29. Mai. 2007 08:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für gdir 10 Unities + Antwort hilfreich

Hallo Noir333,
also ich habe an diesem Wochenende meinen Rechner laufen gelassen um eine recht umfangreiche Berechnung durchzuführen!
Die Vorgehensweise war, wie bereits beschrieben:
Nur ein CATPart, welches im Verlauf der Schleifen immer wieder geschlossen wird und dann wieder neu geladen wird!
Bislang hatten Testrechnungen ohne diese Methode immer wegen Speicherproblemen abgebrochen! Mit dieser Methode aber hat das Programm korrekt durchgerechnet  !!!
Man muss lediglich die Referenzen nach dem laden neu setzen! Zuvor sollte man sich allerdings den Namen der Objekte "gemerkt" haben um die Referenz neu setzen zu können!
Wie Du beschrieben hast, läuft der Speicher mit dieser Methode nur sehr langsam voll! In meinem Fall war die Auslagerungsdatei nach ca.5-6Std. Rechenzeit  ca. 1,5GB groß!
Es ist allerdings zu befürchten, das bei noch umfangreicheren Inhalten irgendwann wieder Schluss ist (>2GB!)! 
Werde die Sache weiter beobachten und ggf. berichten!
Wenn natürlich irgendjemand eine bessere Lösung für dieses Problem hat, darf er gerne berichten ..... 

------------------
-------------------------------------------------
Gruß,
AlfaRomeo75  

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

qli
Mitglied



Sehen Sie sich das Profil von qli an!   Senden Sie eine Private Message an qli  Schreiben Sie einen Gästebucheintrag für qli

Beiträge: 13
Registriert: 16.04.2007

erstellt am: 29. Mai. 2007 17:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für gdir 10 Unities + Antwort hilfreich

Hallo Leute,

Ich weiss nicht ob das weiter hilft, aber ich sage Ihnen was Ich bemerkt habe.

Erst, wichtig ist alles, aber ALLES was nicht nötig ist, zu löschen.
Und auch erst  , alles was nicht unbedingt nötig ist, von die Schleife weg machen.

Meine Schleife sieht endlich so aus:

  For j = dCoordZExtremumZMin To dCoordZExtremumZMax + dPrecision
  Step dPrecision
                               
    oDistance.Compute
    dMinimumValue = oDistance.Value
                         
    If dMinimumValue = 0 Then
      lAreaLocal = lAreaLocal + 1
    End If
           
    oMoveObject.Apply TransformationMatrix
                       
  Next

Ich berechne der kleinste Abstand zwischen 2 körper, in dem ich bewege immer einer von der Körper. kann sein das ich bis zu 800000 mal die bewegung mache und dass macht der Speicher voll.

Am Anfang habe ich wieder und wieder in FOr - NEXT die oDistance Objekt gesetzt und gelöscht... und ich habe bemerkt das Schliessen und Wiederöffnen des Parts bringt fast nichts für Speicher (wie beim Noir333). Ich weiss nicht warum so war wenn ich alles gelöscht habe...
Und dann habe ich so gemacht wie oben, das ich in die Schleife nur die compute befehl mache - die oDistance ist nur einmal vor die Schleife deklariert und gesetzt. Und jetzt wird die Speicher wieder frei beim Schliessen von PArt.

Also, ich weiss nicht was Ihr da programmiert, aber probieren Sie irgenwie die Sachen zu minimieren. Das war mein erstes Makro und ich war sehr geärgert wegen Speicher Problem. Jetzt bin Ich beim zweiten Makro und es wird schlimmer und schlimmer - ich finde mehr Probleme als ich tiefer gehe 
Aber...   na ja... zurück zum Arbeit 

Ciao
qli

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

AlfaRomeo75
Mitglied
Dipl.Ing. - Flächenkonstrukteur/Methodenplaner


Sehen Sie sich das Profil von AlfaRomeo75 an!   Senden Sie eine Private Message an AlfaRomeo75  Schreiben Sie einen Gästebucheintrag für AlfaRomeo75

Beiträge: 174
Registriert: 06.12.2004

-----------------
Windows XP professional Version2002
Service Pack 2
-----------------
CATIA V5 R16 SP5
-----------------
Intel Pentium 4 3,4GHz
4 GB RAM
-----------------

erstellt am: 30. Mai. 2007 07:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für gdir 10 Unities + Antwort hilfreich

Hallo,
es stimmt! Das löschen ist wichtig, da sonst der Speicher nicht freigegeben werden kann! Ausserdem wird CATIA mit zunehmenender Elementzahl in den Schleifen immer langsamer!
Zum Thema Geschwindigkeit noch der Hinweis:
Zuerst habe ich meine Elemente die ich löschen wollte immer in eine Selection gepackt und diese dann gelöscht:
mySelection.Add o_x
mySelection.Add o_....
mySelection.Delete
Alternativ dazu habe ich dann folgendes ausprobiert:
o Sub DeleteObjectForDatum( CATIAReference  iObject)
funktioniert super und ist doppelt(!!!!) so schnell wie die Geschichte über Selection!

Wenn Ihr also nicht nur Speicher-, sondern auch Performance-Probleme habt probiert es einfach mal aus. Bei mir lief der Code doppelt so schnell .... 

------------------
-------------------------------------------------
Gruß,
AlfaRomeo75  

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

noir333
Mitglied
Ingenieur


Sehen Sie sich das Profil von noir333 an!   Senden Sie eine Private Message an noir333  Schreiben Sie einen Gästebucheintrag für noir333

Beiträge: 148
Registriert: 27.01.2004

Dell Precision 450 Dual Xeon, 2MB RAM,
XP SP2, NX3
V5R17SP3

erstellt am: 30. Mai. 2007 08:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für gdir 10 Unities + Antwort hilfreich

Hallo qli,
ja, du hast Recht. Besser als Erzeugen und Löschen ist natürlich, wenn man ein parametrisches Objekt verwendet, das man ändert und dann aktualisiert und immer wieder verwendet. Manchmal geht das leider nicht. Ich habe schon ähnliche Sachen programmiert, wo es auch um Abstands-Messungen ging. Da arbeite ich ähnlich wie Du, der Speicher läuft dadurch nur sehr langsam voll, man kann ca. 20-24 Stunden (je nach Modellgröße) Rechnen, bevor ein Neustart erforderlich ist.

------------------
-----------

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

AlfaRomeo75
Mitglied
Dipl.Ing. - Flächenkonstrukteur/Methodenplaner


Sehen Sie sich das Profil von AlfaRomeo75 an!   Senden Sie eine Private Message an AlfaRomeo75  Schreiben Sie einen Gästebucheintrag für AlfaRomeo75

Beiträge: 174
Registriert: 06.12.2004

-----------------
Windows XP professional Version2002
Service Pack 2
-----------------
CATIA V5 R16 SP5
-----------------
Intel Pentium 4 3,4GHz
4 GB RAM
-----------------

erstellt am: 31. Mai. 2007 07:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für gdir 10 Unities + Antwort hilfreich

Hallo nochmal!
Habe gerade nochmal ein Test laufen lassen und dabei die Zeiten gestoppt! Hier einmal der Aufbau:
Ein CATPart mit einer Linie! Die Linie soll einmal um 360° um die Z-Achse rotiert werden!
In der Variante 1 habe ich die Linie 360x über eine Schleife erzeugen lassen und nicht gelöscht!
Bei der Variante 2 habe ich die Linie wieder 360x erzeugen lassen und anschliessend wieder gelöscht über 'DeleteObjectForDatum'.
In Variante 3 wurde das Rotationsobjekt vor der Schleife deklariert und 1x erzeugt. Innerhalb der Schleife wurde jeweils nur der Parameter (myRotation.Angle) modifiziert!
Hier nun die Ergebnisse:
Variante 1: 11 Sekunden
Variante 2:  5 Sekunden
Variante 3:  2 Sekunden

Ihr habt also Recht! Am besten alles ausserhalb der Schleifen erledigen und dann nur noch Parameter modifizieren! Der Speicher müsste bei dieser Variante ebenfalls deutlich "geschont" werden, da ja viel wenige Elemente erzeugt werden!
Muss nun mal meinen gesamten Code ansehen und schauen ob sich das bei mir realisieren läßt ..... 

------------------
-------------------------------------------------
Gruß,
AlfaRomeo75  

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz