| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Geschwindigkeits Problem (940 / mal gelesen)
|
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 05. Jun. 2022 22:02 <-- editieren / zitieren --> Unities abgeben:
Hallo liebe Lispler, zur Info: Ich lese mit Lisp Datanorm Dateien ein, bearbeite sie und speicher die Daten in eine Access Datenbank. Heute sind es 634379 Zeilen. Mit einem XP Laptop ACAD 2004 Access Treiber Version 4.00.6305.00 Office Paket 2013 Bearbeitungszeit 25 min. und alles ist fertig. Mit einem neuen Laptop Win10 64 Bit ACAD 2022 zum testen Access Treiber Version 14.00.7010.1000 Office Paket 2016 Beabeitungszeit über 6h Da ich eine Anzeige für den Datensatz habe der gerade gelesen wird, kann ich feststellen das mit zunehmender Zeit das einlesen langsamer wird. auf beiden Rechnern ist das selbe Lisp installiert. Ich schreibe die Daten über ADOLISP in die Datenbank ein. Unter Win 7 64 Bit ACAD 2010 war es deutlich schneller als mit dem Xp Rechner. Hat jemand eine Idee wie ich die Bremse lösen kann? Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 07. Jun. 2022 12:30 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Hallo Niggemann, sowas hatte ich mal beim Daten-Auslesen per ODBX. War der Befehl vlax-ldata-put. Bei mir lief Schritt für Schritt der Speicher voll und das Lisp wurde immer Langsamer bis praktisch zum Stillstand. Hab ich rausgefunden indem ich Stück für Stück vom Programm auskommentiert hab bis die Bremse raus war. Kann sein dass dir auch nichts anderes übrigbleibt als dich Schrittweise dem Übeltäter zu nähern. Muss ja nicht sein dass dein Programm einen Fehler hat aber vielleicht eine ungünstige Kombination an Befehlen enthält. Und dass sich manche Lisp-Befehle in neueren Versionen anders verhalten hab ich auch schon erfahren müssen. Da ist auch nicht alles besser blos weil es neuer ist. ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 07. Jun. 2022 15:02 <-- editieren / zitieren --> Unities abgeben:
Hallo Andreas, darn habe ich auch schon gedacht, ist aber schwer nachvollziebar. Ich benutze nur die SQL Befehle insert into, update, delte und select um in die Datenbank zu schreiben oder abzufragen. Das heist ich lese einen Datanormsatz ändere darin ein oder mehrere Felder und schreibe diesen in die Datenbank. Also einmal insert into oder einmal update danach wird er nächste Datensatz gelesen und geschrieben. Was ich am Wochenende raus gefunden habe, wenn ich den SQL Server vom System lösche geht es schneller. Ich muß mich auch korrigieren beim einlesen mit dem installierten SQL Server unter Win 10 ACAD 2022 waren es 9h. Nach dem löschen des SQL Server waren es nur noch 4h. Also scheint das Problem am Access Treiber zu liegen, aber davon habe ich absolut keine Ahnung von wie man dieses Proplem lösen kann. Alle anderen Lisp Programme die 2000 Datensätze aus der Datenbank laden laufen einwandfrei. Milliesekunden kann ich sowieso nicht sehen. Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 08. Jun. 2022 08:18 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Hm ... vielleicht wäre es interessant obs am Lesen, verarbeiten oder am Schreiben liegt. Klammer doch mal das Schreiben aus und schau was passiert. Bei meiner Excel-Schnittstelle hatte ich ganz am Anfang auch Zeile für Zeile bearbeitet, seit ich das Range-Objekt in ein Array auslese (und umgekehrt fürs Schreiben) geht das richtig schnell. Vielleicht musst du nur irgend eine Kleinigkeit ändern ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 08. Jun. 2022 15:33 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, danke für den Hinweis, ich hab das schreiben abgeschaltet und es geht schneller, aber beim einlesen wird es mit zunehmender Zeilen Zahl langsamer Beispiel: bis lese Zeile 1000, hier kann ich die 1. Stelle noch soeben lesen ab lese Zeile 100000, hier kann ich die 3. Stelle noch soeben lesen ab lese Zeile 300000, hier kann ich die 5. Stelle gemütlich lesen und alles wird langsam die CPU Auslastung ist 42% Die Anzeige der gelesenen Zeilen erfolgt in einem DCL Fenster nicht im Textfenster, die Anzeige im Textfenster dauerte in früheren ACAD Versionen zu lange. Gerade noch bei einem anderen Programm getestet das nur liest und die Daten wieder auf die Festplatte schreib ACAD 2004 auf XP Rechner 11 min ACAD 2022 auf Win 10 Rechner nach 1,5h abgebrochen da erst die Hälfte der Daten verarbeitet wurde. Das gleiche Verhalten mit zunehmenden gelesenen Zeilen wird es langsamer. ACAD 2022 hat wohl ein Problem Ascii Dateien zu lesen. Es lebe der Fortschritt! Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 09. Jun. 2022 07:11 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Speicherst du das Gelesene in einer Liste oder bearbeitest du eine Zeile komplett als "temporärer Datensatz" ? Wie ist denn deine Schleife fürs Lesen aufgebaut ? Foreach, mapcar oder irgendwas anderes ? Mit welchen Befehlen arbeitest du beim Lesen ? Da muss doch irgendwo die Bremse zu finden sein ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 09. Jun. 2022 10:19 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, die Datanorm Datei ist im Prinzip eine CSV Datei ähnliche eine Excel Datei, nur mit dem Unterschied das in der 1. Zeile keine Feldnamen stehen. Ein Artikel kann je nach Satztyp 1 - ca. 50 Zeilen enthalten. Beispiel eines einfachen Artikels mit 2 Zeilen: A;A;1515457;00;CIMC VDE Einmaulschlssel 112726;SW 24 1000V isoliert;1;0;St;0; ;D;; B;A;1515457;112726;112726; ;;;;4021103127261; ;83;0;1; ;; so einen Artikel lese ich mit einer while ein und erstelle mir eine Zeile, diese werte ich aus und bearbeite wenn nötig einige Felder. Die Felder bekommen eine Varialbe die ich vorher auf "" gesetzt habe. (setq SKA "" VKZ_A "" ART_NR "" TKZ "" ART_TEXT1 "" ART_TEXT2 "" PKZ "" P_EINHEIT "" EINHEIT "" BRUTTO_PREIS "" RABATT_GRUPPE "" H_WARENGRUPPE "" LANGTEXT "") danach durch forste ich die Zeile um die Felder zu füllen (setq SEMI 0)(setq Z-NR 1) (repeat (strlen n) (setq X (substr n Z-NR 1) Z-NR (+ 1 Z-NR)) (cond ((= SEMI 0) (setq SKA X)) ((= SEMI 1) (setq VKZ_A X)) ((= SEMI 2) (setq ART_NR (strcat ART_NR X))) ((= SEMI 3) (setq TKZ (strcat TKZ X))) ((= SEMI 4) (setq ART_TEXT1 (strcat ART_TEXT1 X))) ((= SEMI 5) (setq ART_TEXT2 (strcat ART_TEXT2 X))) usw. Wenn ich die Zeile abgearbeitet habe schreibe ich sie mit update oder insert in die Datenbank und das in dieser Variante schon über 10 Jahre in einer anderen Variante über 25 Jahre ohne Probleme. Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 09. Jun. 2022 14:23 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Hallo Niggemann, da hab ich grade auch keine Idee mehr ohne selbst das Programm mal auseinanderzunehmen. Schreibst du die Daten direkt nach der Bearbeitung zurück in die Datei oder erst mal in eine Datenliste ? Ich hab hier z.B. so ein "modernes" SharePoint-Laufwerk und das ist soooo elend langsam. Ach übrigens ... ich heiße Andreas ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 09. Jun. 2022 16:24 <-- editieren / zitieren --> Unities abgeben:
Hallo Andreas, mit dem Namen tut mir leid war keine böse Absicht. Ich lese einen Artikel und speicher diesen sofort wieder. Gerade habe ich mal einen Test gemacht wenn mein Lisp ausser lesen nichts macht, nur zum lesen von 634379 Zeilen brauche ich genau 4 min. Also muß in apply, strcat, substr oder reverse sich was zwichen ACAD 2004 und ACAD 2022 geändert haben, den diese 4 Befehle benutze ich noch. In der Hilfe habe ich dazu nichts gefunden. Gruß Niggemann Nachtrag Gleiche Daten mit gleichen Lisp ACAD 2004 nur lesen 1 min 62 sec, mit Asatz verarbeiten ohne schreiben 5 min ACAD 2022 nur lesen 4 min, mit Asatz verarbeiten ohne schreiben 11 min Dies Zeilen beinhalten den Asatz: (cond ((and (= (substr ZEILE 1 1) "A") (or (/= STK1 nil)(/= STK2 nil)(/= STK3 nil) (/= STK4 nil)(/= KZ1 nil)(= SUCHEN 1)) ); ende and (setq A_SATZ ZEILE Z-NR 1) (setq SKA nil VKA nil AARTNR nil TKZ nil KTEXT1 nil KTEXT2 nil PKZ nil PE nil) (setq ME nil APREIS nil RABG nil WARG nil LTNR nil) (repeat (strlen A_SATZ) (setq X (substr A_SATZ Z-NR 1) Z-NR (+ 1 Z-NR)) (if (= ";" X)(setq SEMI (+ 1 SEMI) X "")) (cond ((= SEMI 0)(setq SKA X)) ((= SEMI 1)(setq VKA X)) ((= SEMI 2)(setq AARTNR (cons X AARTNR))) ((= SEMI 3)(setq TKZ (cons X TKZ))) ((= SEMI 4)(setq KTEXT1 (cons X KTEXT1))) ((= SEMI 5)(setq KTEXT2 (cons X KTEXT2))) ((= SEMI 6)(setq PKZ X)) ((= SEMI 7)(setq PE X)) ((= SEMI 8)(setq ME (cons X ME))) ((= SEMI 9)(setq APREIS (cons X APREIS))) ((= SEMI 10)(setq RABG (cons X RABG))) ((= SEMI 11)(setq WARG (cons X WARG))) ((= SEMI 12)(setq LTNR (cons X LTNR))); Langtextnummer ); ende cond ); ende repeat (setq AARTNR (reverse AARTNR) AARTNR (apply 'strcat AARTNR)) (setq TKZ (reverse TKZ) TKZ (apply 'strcat TKZ)) (setq KTEXT1 (reverse KTEXT1) KTEXT1 (apply 'strcat KTEXT1)) (setq KTEXT2 (reverse KTEXT2) KTEXT2 (apply 'strcat KTEXT2)) (setq ME (reverse ME) ME (apply 'strcat ME)) (setq ME1 ME) (cond ((or (= ME "S")(= ME "ST")(= ME "STK")(= ME "St") (= ME "STCK")(= ME "stck")(= ME "Stck")) (setq ME STK1 ZSTK1 (+ 1 ZSTK1))) ((or (= ME "M")(= ME "m")) (setq ME STK2 ZSTK2 (+ 1 ZSTK2))) ((or (= ME "PAAR")(= ME "PR")(= ME "Paar")) (setq ME STK3 ZSTK3 (+ 1 ZSTK3))) ((or (= ME "SET")(= ME "Set")) (setq ME STK4 ZSTK4 (+ 1 ZSTK4))) ((or (= ME "PK")(= ME "Pack")) (setq ME STK5 ZSTK5 (+ 1 ZSTK5))) ;(ME T) ) ; ende cond (setq APREIS (reverse APREIS) APREIS (apply 'strcat APREIS)) (setq RABG (reverse RABG) RABG (apply 'strcat RABG)) (setq WARG (reverse WARG) WARG (apply 'strcat WARG)) (setq LTNR (reverse LTNR) LTNR (apply 'strcat LTNR)) (if (/= KZ1 nil)(setq VKA KZ1)) (setq A-SATZ (strcat SKA ";" VKA ";" AARTNR ";" TKZ ";" KTEXT1 ";" KTEXT2 ";" PKZ ";" PE ";" ME ";" APREIS ";" RABG ";" WARG ";" LTNR ";" )) ; zum Testen auskommentiert ;X (if (= SCHREIBEN 1 )(write-line A-SATZ EIN)) ;X (if (and E2 (= SCHREIBEN 1 ))(write-line AARTNR EIN2)) (setq Z-NR 1)(setq SEMI 0) ); ende ausdr. "A" ((and (= (substr ZEILE 1 1) "A")(= SUCHEN 0)(= SCHREIBEN 1) (= KZ1 nil)) (write-line ZEILE EIN)) ) [Diese Nachricht wurde von Niggemann am 09. Jun. 2022 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 10. Jun. 2022 07:17 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Da ist doch gar nichts schlimmes drin . Man kann das zwar etwas optimieren aber zeitkritisch ist hier auf den ersten Blick gar nichts. Bau mal (notfalls Zeilenweise) das hier ein:
Code: (defun k_time_ms (/ z) ;;; gibt die aktuelle Zeit in der Form HH:MM:SS:MS zurück (setq z (getvar "cdate")) (setq z (- z (fix z))) (setq z (substr (rtos z 2 9) 3)) (while (< (strlen z) 8) (setq z (strcat z "0")) ) (setq z (strcat (substr z 1 2) ":" (substr z 3 2) ":" (substr z 5 2) ":" (substr z 7 3) ) ) )
Also (print k_time_ms) Dann bekommst du schön nacheinander die Zeit von einem Befehl zum nächsten und siehst ziemlich gut wo genau die Bremse ist. Hat mir auch schon oft bei sowas geholfen. ------------------ Geht nicht, gibts nicht
Gruß Andreas http://kraus-cad.de [Diese Nachricht wurde von Andreas Kraus am 10. Jun. 2022 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 10. Jun. 2022 10:30 <-- editieren / zitieren --> Unities abgeben:
Hallo Andreas, deinen Vorschlag werde ich am Wochenende testen, die Idee ist gut. Aber was ist wenn ACAD den Rechner nicht richtig nutzt? Von meinen 12 Kernen auf der CUP werden nur 2 genutzt, Kern 2 und 4, die aber richtig und der Rest schlummert vor sich hin, freigeben für ACAD sind alle 12 Kerne, und wenn man das hochrechnet wenn alle 12 Kerne arbeiten würden sieht es ganz andwers aus. Die Frage ist dann nur gibt es eine Einstellung um ACAD zu sagen das es auf Voller Leistung laufen soll. Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2799 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 10. Jun. 2022 13:29 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
|
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 12. Jun. 2022 22:32 <-- editieren / zitieren --> Unities abgeben:
So das Wochenende mit testen verbracht Deine Funktion war mir eine große Hilfe, hab sie aber ändern müssen da ab ACAD 2017 sich was geändert wurde, lt. Offline Hilfe ACAD 2022. (defun K_TIME_MS (/ z ms) ;;; gibt die aktuelle Zeit in der Form HH:MM:SS:MS zurück (if (<= (atof (getvar "ACADVER")) 22.0) (progn (setq z (getvar "cdate")) (setq z (- z (fix z))) (setq z (substr (rtos z 2 9) 3)) (while (< (strlen z) 8) (setq z (strcat z "0")) ) (setq z (strcat (substr z 1 2) ":" (substr z 3 2) ":" (substr z 5 2) ":" (substr z 7 3))) );ende progn (progn (setq ms (getvar "MILLISEC")) (setq z (strcat (rtos (getvar "cdate") 2 6)(substr ms (- (strlen ms) 2)))) (setq z (strcat (substr z 10 2) ":"(substr z 12 2) ":" (substr z 14 2) ":" (substr z 16 3))) );ende progn ) ; (print Z) ) Nach dem ich die Funktion eingebaut habe und meine Anzeige der gelesenen Zeilen im DCL Fenster abgeschaltet habe bekomme ich folgende Zeiten bei den mehr als 600000 Zeilen: ACAD 2022 Anzeigen der gelesenen Zeilen abgeschaltet nur lesen und Asatz bearbeiten mit abschalten der Zähler ZSTK1 und ZSTK2 nur noch 20 min 3 Zeilen in 1ms verabeitet dann 15 ms pause und wieder 3 Zeilen in 1ms verarbeite bei 0 - 50 Zeilen 2 Zeilen in 1ms verabeitet dann 15 ms pause und wieder 1 -2 Zeilen in 1ms verarbeite bei 300000 - 300050 Zeilen Mit Anzeigen der gelesenen Zeilen eingeschaltet nur lesen ohne schreiben 32 min, also ist die Anzeige der gelesenen Zeilen eine Bremse. Eine Anzeige im Textfenster geht nicht da dieses während der Laufzeit nicht aktualisiert wird. Mit eingeschalteten Zähler 21 min Zähler ZSTK1 ist am Ende bei 303846 Zähler ZSTK2 ist am Ende bei 9170 Also machen solche Variablen kaum was aus. Ich gehe mal davon aus das man daran nichts ändern kann, an Lisp scheint es nicht zu liegen. Da hat wohl Autodesk kräftig an der Konsole geschraubt, das Problem kann ich nur etwas minimieren und habe dafür aber keine Information wieviel Zeilen gelesen werden und ob das Programm noch arbeitet. Nur zur Info, ACAD 2004 schreibt nach der Zeitmessung 11 - 14 in 1 ms ohne eine Pause von 15 ms einzulegen. Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 13. Jun. 2022 08:33 <-- editieren / zitieren --> Unities abgeben: Nur für Niggemann
Moin Niggemann, genau diesen Effekt hatte ich bei meiner Excel-Schnittstelle auch, deshalb hab ich die umprogrammiet und lese das Range-Objekt in ein Array und mache daraus eine Liste zum verarbeiten. Beim Schreiben dann andersrum. Seitdem gehts wieder. Da hab ich alle Infos hier im Forum gefunden. Danke nochmal an alle Beteiligten. Mit so großen Dateien hab ich zum Glück nichts zu tun aber der Effekt ist wohl der Selbe ... interessant. Keine Ahnung was genau ADesk da geändert hat (und warum überhaupt) aber ärgerlich ist es auf alle Fälle. Vielleicht weis ja jemand mit welchen Tricks man Dateizugriffe beschleunigen kann, da hab ich mich noch nicht so mit beschäftigen müssen.
------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |