Autor
|
Thema: Steigender Speicherbedarf (1073 mal gelesen)
|
dragon67 Mitglied Projektleiter Lichttechnik
Beiträge: 3 Registriert: 03.07.2009 XP 64; Catia 64 Bit Quadcore 8GB RAM
|
erstellt am: 03. Jul. 2009 10:26 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, zunächst möchte ich mich vorstellen. Mein Name ist Bernd und ich komme aus Reutlingen. Ich bin im Bereich der Licht-Simulation tätig und beschäftige mich seit einiger Zeit mit der Programmierung von Tools in diesem Bereich. Momentan arbeite ich an einem großen Projekt, bei dem in Catia ca. 34000 Varianten eines optischen Systems getestet werden sollen. Dazu habe ich ein entsprechendes parametrisiertes Modell erstellt und die Parameter mit einer Designtable verknüpft. Mein Makro lädt nun zunächst eine Konfiguration, und macht auf das Produkt einen Update. Danach wird eine Simulation in SPEOS (Optiksoftware in Catia integriert) ausgeführt und das Simulationsergebnis abgespeichert. Anschließend beginnt die Schleife mit der nächsten Konfiguration u.s.w. Das funktioniert auch alles ganz gut so. Nur leider habe ich festgestellt, dass CATIA pro Durchlauf immer etwas mehr Speicher belegt. Und so bricht das Programm nach einigen Stunden aufgrund von Speichermangel ab. Ich habe das auf mehreren Rechnern und Catia-Versionen (32bit und 64bit) getestet. Früher oder später immer mit dem selben Ergebnis. Um die Rechenzeiten zu verkürzen laufen auf der Quadcore-Maschine 4 Makros gleichzeitig (ca.1,5Min pro Durchlauf). Eigentlich sollte der Rechner mehrere Tage am Stück durchlaufen um die Aufgabe in endlicher Zeit zu lösen. Gibt es also eine Möglichkeit den Speicherbedarf von Catia zu reduzieren. Ich erzeuge ja keine neuen Geometrien also sollte der Speicherbedarf eigentlich konstant bleiben. Wer kann mir da weiterhelfen??
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Florian Held Mitglied Teamleiter CAD-Solutions
Beiträge: 81 Registriert: 07.09.2006
|
erstellt am: 03. Jul. 2009 11:19 <-- editieren / zitieren --> Unities abgeben: Nur für dragon67
Hi, auch wenn sich das Problem sehr spezifisch ist und ich nur raten kann vielleicht hilft es dir ja: Wenn mein Rechner aus sicht des Speicherbedarfs in die Knie geht da ich seit längerem an einer Konstruktion arbeite schließe ich alle geöffneten Dokumente und lade meine Konstruktion mal eben so neu. Wenn ich dich richtig verstehe veränderst du Geometrien mittels Konstruktionstabelle bzw. Parametern um deine Varianten zu erzeugen. Also auch wenn du nicht wirklich Geometrien erzeugst veränderst du diese ständig weshalb hierdurch auch entsprechend (zumindest etwas) Speicherbedarf entsteht. Dies erklärt auch warum der Speicher ständig wächst. Beim schließen der Dokumente werden die meisten Daten aus dem Speicher entladen und beim erneuten öffnen dieser "frisch befüllt". Allerdings: Je nach Konstruktionsgröße dauert mein "mal eben neu laden der Konstruktion" ohne Chachemodus (bringt die ja nichts da du die Daten verändern musst) schon mal gut ne viertel Stunde bei ner 2-3GB großen Konstruktion (Speicherbedarf HDD). Größere Konstruktionen entsprechend noch länger. Kommt also darauf an wie groß deine zu ladende Modelle und wie oft du den Speicher (nach x Varianten) leerräumen möchstest. Kurzum meine Idee für dich: Alle X Berechnungsdurchläufe alle geöffneten Dokumente der Catia-Sitzung schließen und neu öffnen, anschließend bei der nächsten Berechnung weitermachen.
------------------ MfG, Florian Held Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RSchulz Moderator² Head of CAD, Content & Collaboration / IT-Manager
Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 03. Jul. 2009 11:49 <-- editieren / zitieren --> Unities abgeben: Nur für dragon67
Hallo, das reine Schließen der Dokumente bringt meiner Meinung nach eigentlich nicht viel, da die Daten erst vollständig beim Schließen von CATIA entladen werden. Es gibt jedoch Tools, die den Speicher beobachten und nicht verwendete Daten wieder freigeben. Schau dir hierzu mal folgende Seite an: http://www.cleanup-xp.de/ Die Software kostet zwar, aber immerhin nur 17¤ bzw. 20¤. Ich würde dir aber empfehlen nur für den Notfall vorher ein Backup der Systemplatte zu ziehen. Außerdem würde ich dir empfehlen unter Tools > Options > General/Allgemein > PCS die Stapelgröße runter zustellen (vll. sogar auf 0). Diese ist für die Speicherung von ReDo/UnDo-Vorgängen zuständig. Wenn alles nichts hilft, dann würde ich die Aufgabe soweit möglich aufteilen. ------------------ MFG Rick Schulz Nettiquette (CAD.de) Konfuzius sprach: "Wer sich das Alte noch einmal vor Augen führt, um das Neue zu verstehen, der kann anderen ein Lehrer sein." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dragon67 Mitglied Projektleiter Lichttechnik
Beiträge: 3 Registriert: 03.07.2009 XP 64; Catia 64 Bit Quadcore 8GB RAM
|
erstellt am: 03. Jul. 2009 13:58 <-- editieren / zitieren --> Unities abgeben:
Hallo, schon mal vielen Dank für die schnellen Antworten. Also das mit den Speichertools wird wohl nicht funktionieren, da ich erstens XP64 einsetzen und zweitens kann das Tool wohl nicht den Speicher eines laufenden CATIA-Prozessen minimieren. Die Variante mit den schließen und neuladen teste ich jetzt gerade. Vielleicht hilft es ja. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Florian Held Mitglied Teamleiter CAD-Solutions
Beiträge: 81 Registriert: 07.09.2006
|
erstellt am: 03. Jul. 2009 14:06 <-- editieren / zitieren --> Unities abgeben: Nur für dragon67
Hi, also sollte speichern/schließen allein nicht funktionieren müsste man wirklich bei einem Catia-Neustart ansetzen. Allerdings müsste man dann mit der Programmierung zumindest teilweise aus Catia herrausgehen (z.B VB.Net, TCL etc.), da das Programm den letzten Durchlauf merken, Catia neu starten und das Modell laden und das Makro mit den letzten gemerkten Durchlauf +1 wieder starten müsste (Sofern man dann nicht den kompletten Ablauf übers Externe Programm abwickelt sondern nur den Neustart). ------------------ MfG, Florian Held Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 605 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 06. Jul. 2009 07:07 <-- editieren / zitieren --> Unities abgeben: Nur für dragon67
Moin, ich habe in ähnlichen Zusammenhängen das gleiche Problem: wenn CATIA stunden-/ tagelang läuft und rekursiv per Script Vorgänge abarbeitet, ist irgendwann Schluß und CATIA hängt sich auf. Ich bin nach langen hin und her zu folgenden Schlußfolgerungen gekommen (und erhebe keinen Anspruch darauf, Recht zu haben). Ist alles nur eine Vermutung: - es liegt nicht daran, das im Script für irgendwelche Objekte allokierter Speicher nicht mehr freigegen wird. Das habe ich tagelang ausprobiert, siehe auch diesen Post: http://ww3.cad.de/foren/ubb/Forum137/HTML/002119.shtml#000007 - o.a. Speichermanagment-Tools bringen überhaupt nichts. Zumindest diejenigen nicht, welche ich getestet habe. (Allerdings ist das schon ein bischen her.) - Tools > Options > General/Allgemein > PCS die Stapelgröße ändern bringt gar nix - es hat auch nichts primär mit der "Größe/Menge" der geladenen Daten zu tun: wenn ich eine Zeichung mit nichts als einer einzigen Linie drin rekursiv ein paar tausend mal öffne, als pdf speichere und wieder schliesse hängt sich CATIA irgendwann auf: eine große Datenmenge beschleunigt den Vorgang eben nur. Insofern gebe ich okl an dieser Stelle recht (bezieht sich auf die Diskussion im o.a. Post) - Ich habe auch versucht per Script (ich arbeite mit VB6 /.Net, nicht mit CATscript oder VBA) im RAM bzw. der Auslagerungsdatei rumzuwurschteln. Dafür reichen allerdings meine Kentnisse nicht aus. Das hat keinen Erfolg gehabt. - ich bin zu dem Schluß gekommen, das die Auslagerungsdatei (bzw. deren Größe: sie wächst an) das Problem ist und nur das Schließen von CATIA hilft. Ich verwende seitdem immer wieder folgende Vorgehensweise: - der Ablauf ist auf 2 unabhängige Prozesse aufgeteilt (beides .exes) - die eine .exe ist im Prinzip nichts weiter als eine Fortschrittsanzeige, die zudem beim Scriptstart CATIA ausließt (Release, Environment ....), schliesst, neu startet und dabei die Prozeß-ID erfasst, die 2 .exe startet (und die Prozeß-ID erfasst) und rekursiv alle 10 sec kontrolliert, ob die beiden Prozesse noch laufen. Dieser Vorgang "belastet" den Arbeitsspeicher nicht wesentlich. - die 2 .exe ist das eigentliche "Arbeitsscript" und macht, was eben gemacht werden soll. Nach jeder Schleife wird ein Eintrag in eine .txt-Datei geschrieben. - die erste .exe kontrolliert die .txt-Datei. Wenn sich dort der Eintrag innerhalb einer Zeitspanne X nicht geändert hat killt das Script zuerst die andere .exe, dann CATIA und öffnet dann beides wieder und weiter. - die erste .exe kontrolliert die zweite sowie CATIA. Hat sich ein Prozeß aufgehängt wird der andere gekillt + beides neu gestartet - Beide Prozesse schreiben permanet in einen logfile was sie so treiben. - beim starten der .exes kann man Paramter übergeben Das ist äüsserst stabil und läuft tagelang ohne Probleme. Probleme treten nur Serverseitig auf: falls der länger ausfällt kann ich das nicht mehr abfangen. Ich habe ursprünglich versucht die Größe der Auslagerungsdatei zu überwachen und beim Erreichen eines bestimmten Wertes CATIA zu schliessen. Das habe ich nicht hinbekommen (vielleicht hat ja jemand hierzu eine Idee). Stattdessen schliesse ich CATIA proforma alle X-Stunden. Ich hoffe, das gibt dir ein paar Denkanstöße. Gruß ------------------ tomtom1972 [Diese Nachricht wurde von tomtom1972 am 06. Jul. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dragon67 Mitglied Projektleiter Lichttechnik
Beiträge: 3 Registriert: 03.07.2009 XP 64; Catia 64 Bit Quadcore 8GB RAM
|
erstellt am: 16. Jul. 2009 15:08 <-- editieren / zitieren --> Unities abgeben:
@ tomtom1972 Vielen dank für deine Informationen. Das hat mir stundenlange Fehlersuche erspart. Mein Makro schreibt jetzt immer den aktuellen Status in eine Datei und beendet Catia nach 50 Durchläufen. Ein externes Programm erkennt nun in der Datei, dass Catia beendet wurde und führt einen Neustart durch. Das Problem dabei ist jetzt nur, dass sich Catia nicht zuverlässig beendet. Dann habe ich ein "altes" Catia mit ca. 2,5GB Speicherbelegung und zusätzlich öffnet sich dann ein weiteres, u.s.w. Manchmal hab ich dann 10 Catias auf und der Rechner hängt komplett. Zum Beenden führe ich im Makro den Befehl "Catia.Quit" aus. Gibt es eine andere Methode um Catia sicher zu beenden?? Vielen Dank im Voraus... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 605 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 17. Jul. 2009 07:51 <-- editieren / zitieren --> Unities abgeben: Nur für dragon67
Hallo, das geht mit ein bischen VBScript (VisualBasic6.0) ..... .... ganz am Anfang CATIA auslesen (welches + Environment) .... CATIA.Quit (funktioniert ohne Probleme, da du ja noch nichts gemacht hast) .... damit du die TaskID kennst CATIA wie folgt öffnen Code: lTaskID = Shell(sCatShellExe, vbNormalFocus) '--- sCatShellExe ist ein String, siehe unten
.... die Applikation anziehen (je nachdem wer wann wie wo CATIA öffnet dauert das unterschiedlich lang, auf jeden Fall ein paar Sekunden)
Code:
Err.Clear On Error Resume Next Do Break 1 '--- ist eine Funktion, siehe unten Err.Clear Set CATIA = GetObject(, "Catia.Application") Loop Until (Err.Number = 0) On Error Goto 0
.... Und irgendwann dann den CATIA-Prozeß killen: das ist wie im TaskManager die CNext.exe abschießen Code: cmdTerminate lTaskID
cmdTerminate ist eine eigene Sub, siehe unten der String sCatShellExe (beispielhaft): du musst halt wissen, welches CATIA du mit welchem Env starten willst; vorher auslesen.
Code: sCatShellExe = "C:\opt\ds\catia\1605_AUDIVW\intel_a\code\bin\CNEXT.exe -direnv " & Chr(34) & "C:\Documents and Settings\User" & Chr(34) & " -env " & Chr(34) & "Test.txt" & Chr(34)
die Pause Funktion
Code: Function Break(iSec As Long) Start = Timer Do While Timer < Start + iSec DoEvents Loop End Function
Und die Sub zum Killen des Prozesses (mit den notwendigen Deklarationen)
Code: Private Declare Function CloseHandle Lib "kernel32" (ByVal _ hObject As Long) As LongPrivate Declare Function OpenProcess Lib "kernel32" (ByVal _ dwDesiredAccess As Long, ByVal bInheritHandle As _ Long, ByVal dwProcessId As Long) As Long Private Declare Function TerminateProcess Lib "kernel32" (ByVal _ hProcess As Long, ByVal uExitCode As Long) As Long Const PROCESS_TERMINATE = &H1 Sub cmdTerminate(lTaskID) Dim hTask As Long Dim lResult As Long hTask = OpenProcess(PROCESS_TERMINATE, 0&, lTaskID) lResult = TerminateProcess(hTask, 1&) lResult = CloseHandle(hTask) End Sub
Sofern du nur ein CATIA geöffnet hast (und das ist die Einschränkung) kommst du auch ohne den Neustart aus und wie folgt an die TaskID
Aufruf über Code: lTaskID = GetCNextID
Und die Funktion selbst (mit den notwendigen Deklarationen) Code: Private Declare Function CloseHandle Lib "kernel32" (ByVal _ hObject As Long) As LongPrivate Declare Function CreateToolhelp32Snapshot Lib "kernel32" _ (ByVal lFlags As Long, ByVal lProcessID As Long) As Long Private Declare Function ProcessFirst Lib "kernel32" Alias _ "Process32First" (ByVal hSnapShot As Long, uProcess _ As PROCESSENTRY32) As Long Private Declare Function ProcessNext Lib "kernel32" Alias _ "Process32Next" (ByVal hSnapShot As Long, uProcess _ As PROCESSENTRY32) As Long Const TH32CS_SNAPPROCESS As Long = 2& Const MAX_PATH As Integer = 260 Private Type PROCESSENTRY32 dwSize As Long cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwFlags As Long szExeFile As String * MAX_PATH End Type Public Function GetCNextID() As Integer Dim hSnapShot As Long, Result As Long Dim aa As String, bb As String Dim Process As PROCESSENTRY32 Dim iCatia As Integer iCatia = 0 hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&) If hSnapShot = 0 Then Exit Function Process.dwSize = Len(Process) Result = ProcessFirst(hSnapShot, Process) Do While Result <> 0 aa = Process.szExeFile aa = Left$(aa, InStr(aa, Chr$(0)) - 1) If Right$(LCase(aa), 4) = ".exe" Then If LCase(aa) = "cnext.exe" Then GetCNextID = Process.th32ProcessID End If End If Result = ProcessNext(hSnapShot, Process) Loop Call CloseHandle(hSnapShot) End Function
Hoffe das hilft dir ------------------ tomtom1972 [Diese Nachricht wurde von tomtom1972 am 17. Jul. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|