LabVIEWForum.de - Speicherüberlauf bei häufigen Aufruf einer dll

LabVIEWForum.de

Normale Version: Speicherüberlauf bei häufigen Aufruf einer dll
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,
ich verwende LV9 und habe mich mit Diffie-Hellman Schlüsselaustausch beschäftigt. Dazu habe ich erst das Ganze in LabVIEW gepackt und die langen Zahlen mit Binärarrays gerechnet. Das war sehr ineffizient. (300s pro Punktberechnung bei 224bit langen Zahlen). Da ich leider nicht viel Ahnung von C habe sind mir vorgefertigte Programme wie (Cyptopp oder OpenSSL) leider verschlossen geblieben.
Dazu habe ich selbst eine dll (Visual C++ 6) geschrieben die die langen Zahlen berechnet. Nachdem ich dann +;-;x;/, sowie y^x und die Punktinversion eingebunden hatte war ich schon bei 10s pro Punkt angekommen. Die Division wurde dan anstatt mit 8bit Arrayelementen in binär umgestellt und dann waren es nur noch 2,5s. Das ist schon brauchbar. Es ist allerding nun so, dass ich bei der Division und bei der Punktinversion Hilfsarrays (intern) brauche um zu rechnen.
Dazu verwende ich LabVIEW-Array-Handles. Als Problem hat sich nun herausgestellt das pro Slakarmultiplikation etwa 20MB Speicher belegt werden.
Dies geht dann so oft bis Windows sagt das der Speicher voll ist (ich glaube so bei 800MB). Ich habe schon einige Experimente unternommen das irgendwie hinzubekommen den Speicher nach Abschluß der Operation frei zu bekommen. Aber entweder LabVIEW stürtz ab oder die Berechnung wird falsch.
Ich hoffe bei diesem Problem kann mir von Euch jemand helfen. Denn ich weiß nicht mehr was ich am besten unternehmen kann....

Ich habe einen Teil der cpp-Datei drangehängt. Dort ist die Division drin.TD1Hdl Zahlenformat int und TD2Hdl Zahlenformat bool

Vielen DankSmile
Auu! Jemand der noch nicht so viel versteht von LabVIEW Datentypen und dann gleich in C damit loslegen will. Wink

Ich habe Deinen Code kurz überflogen und da gibt es einiges anzumerken was grässlich schief gehen kann.

Deine Fehlerbehandlung ist nicht ganz konsistent. Bei Zeile 76 - 83 setzt Du zwei Arrays auf eine andere Länge aber setzt den Längenindikator beider erst danach. Wenn die zweite Längenänderung fehlschlägt ist das erste Array in einem ungültigen Zustand wenn Dein Code zum LabVIEW Diagram zurückkehrt.

Und jetzt kommt Dein Memoryleak! Du legst zwar die b_MOD, b_tst und b_hilf Arrays auf dem Funktionsstack an, aber vergisst diese am Ende der Funktion wieder freizugeben. Mach also unter dem Ausgang: Label noch ein

if (var) DSDisposeHandle(var);

für alle drei Variablen.
Hallo Rolfk,

ich habe das mal so ausprobiert und jetzt funktioniert es. Der Speicher läuft nicht voll. Das ich etwas einfügen muss, um den reservierten Speicher wieder freizugeben, wusste ich schon. Einige Kommandos und Versuche hatte ich schon unternommen, allerdings ohne einen Erfolg.

Vielen Dank nochmals.

René
maexx
Referenz-URLs