Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 243043 (4479)
  Suchen
 Zurück zur Übersicht
 AutorThema: DB und der Speicher
Gerd Telzerow
Datum:21.03.02 21:57 Antwortenals Email verschicken (GTelzerow@T-Online.de) 


Hallo Profaner,

Ich habe ein (Speicher) Problem mit der DB.

In meinen Programm-Projekt hat der Anwender die Möglichkeit, Patienten zu verwalten und eine Komplette Abrechnung des Laufenden Monats vorzunehmen.
Pro Patient sind insgesamt 408 Einträge in verschiedene DB möglich. Ich sichere die Daten je Patient im Dialog Speichern mit "DBClose" (das Blaue Fenster von WIN kennt jeder)der Anwender ist dann schon frustriert genug, oder? Ich kann ihn nicht zumuten das er dann auch noch z.B. 50 Patienten a 408 Einträge neu erstellen muss!
Das Problem: Bei jeder Öffnung einer DB wird das Laufende Programm Größer, das Programm wird Langsamer und wenn die Ressourcen erschöpft sind "bitte vergrößern Sie die Auslagerungsdatei".

Danke im voraus

Gerd


Thomas Erny
Datum:22.03.02 00:29 Antwortenals Email verschicken (thomas.erny@bluewin.ch) 


Hallo Gerd

Das Problem ist mir bestens bekannt - aber leider kann ich Dir nicht helfen. Ich denke es ist ein Bug in dbOpen/dbClose, da die Funktinen Arbeitsspeicher beanspruchen, den sie nicht mehr freigeben.
Es scheint allerdings nicht der einzige Bug zu sein. Wenn man eine geöffnete Tabelle mit vielen Datensätzen füllt, so wird das Programm immer langsamer und langsamer, wobei beim Speicher kein Verlust festzustellen ist.
Ich hoffe stark, dass sich Roland darum kümmert - schliesslich sind diese dBase-Funktionen super praktisch.

Thomas


Bernd
Datum:22.03.02 08:48 Antwortenals Email verschicken (info@ebs-haase.de) 


Hi!

Ich arbeite ausschließlich mit DB. Hierbei eist es sehr wichtig, für welche Programmiertechnik man sich entscheidet. Es ist wichtig zu wissen, daß erst beim DBClose die Datensätze in die DB geschrieben werden.
Somit ist folgendes festzuhalten:
Wenn ich eine "Einplatzanwendung" schreibe eröffne ich die DB am Progammanfang und schließe am Programmende (einfach nicht wahr).Sollten in diesem Programm viele Datensätze aufgebaut werden ( wie in Eurem Beispiel ), dann beansprucht das natürlich auch viel Speicher. Es sei denn, man schließt zwisschendurch die DB ( dies würde ich vorschlagen ). Das hat den Effekt, das maximal ein DS verloren geht, bei einem Absturz oder BLue Sscreen.
Bei "Mehrplatzanwendungen" würde ich die DB eröffnen, Daten abarbeiten und wieder schließen. Dieses manche ich so, schon auf Hinblick der Multiuserfähigkeiten bei DBASE III DBs.
Vielleicht hilft euch diese kleine Ausführung. Wenn Ihr weitere Fragen habt, könnt Ihr mich gerne anmailen.

:-)) Bernd


Thomas Erny
Datum:22.03.02 10:13 Antwortenals Email verschicken (thomas.erny@bluewin.ch) 


Hallo

Ich denke, es handelt sich da wirklich um einen Bug. Das folgende kleine Beispiel mit der Beispieldatenbank von Profan7 zeigt es deutlich:

Cls
Declare Anzahl%
WhileLoop 2000
Let Anzahl% = @dbOpen(#1,"C:\\PROGRAMME\\PROFAN70\
\\DEMO\\ADRESS.DBF") ' Pfad anpassen
@dbUse(#1)
Print "ADRESS.DBF hat",Anzahl%,"Datensätze!"
@dbClose(#1)
EndWhile
WaitInput

Für das 2000 mal öffnen und schliessen der Tabelle braucht das Programm ca. 30 MB Arbeitsspeicher, den es erst nach Programmende wieder freigibt.

Mit dem modifizierten Beispiel kann man den Speicher auch gleich mit anzeigen:

Decimals 0
Declare Anzahl%, MemStat#
Def GlobalMemoryStatus(1) !"KERNEL32","GlobalMemoryStatus"
Def Mbyte(1) Round(Div(&(1),$0100000),0)

Cls
WhileLoop 2000
Dim MemStat#,32
Long MemStat#,0=32
GlobalMemoryStatus(MemStat#)
Let Anzahl% = @dbOpen(#1,"C:\\PROGRAMME\\PROFAN70\
\\DEMO\\ADRESS.DBF") ' Pfad anpassen
@dbUse(#1)
Print "ADRESS.DBF hat",Anzahl%,"Datensätze!",\
MByte(Long(MemStat#,12)), "MB Speicher frei"
Dispose MemStat#
@dbClose(#1)
EndWhile
WaitInput

Gruss Thomas




Gerd Telzerow
Datum:22.03.02 14:07 Antwortenals Email verschicken (GTelzerow@T-Online.de) 


Hallo Bernd,

mit dem Umgang einer DB habe ich keine Probleme, das Problem ist Treffend von Thomas Erny dargestellt.
Ich habe eine Lösung gefunden ist nicht Optimal aber es geht erstmal.

Eine neue Datei erstellen z.B. DBSichern.exe
'*****************
Declare Datei$,Eintrag$

Proc NeuerPatient
@dbAppendBlank()
@dbPutMemo("DIAGNOSE")'Problem
@dbPut("NAMEP",@Trim$(@ReadIni$("DBIII.INI","EINTRAG","A2")))
@dbPutRec(0)
EndProc

Let Datei$=@ReadIni$("DBIII.INI","EINTRAG","A0")
Let Eintrag$@ReadIni$("DBIII.INI","EINTRAG","A1")

@DBOpen(#1,Datei$)
@dbUse(#1)

Eintrag$

@dbClose(#1)

End

'***************

und im Laufendem-Programm das Programm mit Shell Aufrufen

WRITEINI "DBIII.INI","EINTRAG","A0"="Algemei.dbf"
WRITEINI "DBIII.INI","EINTRAG","A1"="NeuerPatient"
WRITEINI "DBIII.INI","EINTRAG","A2"="Telzerow"
und.....

Shell "DBSichern "

Gerd


Dirk
Datum:10.04.02 16:50 Antwortenals Email verschicken (dige@gmx.de) 


Diese Speicherfresserei ist wirklich problematisch.
Ich habe bei meiner Börsensoftware das gleiche Problem,
die gedownloadeten 5.000 Kurse werden in entsprechende
Tabellen geschrieben ... da gehen nach jedem Download 60MB!!! Speicher drauf. Bei mir hilft zZ. nur noch ein Neustart :-(

Es wäre wirklich toll wenn das Problem mal gelöst werden
könnte. Gibt es vielleicht irgend welche FreeWare dlls
die den dBase Zugriff ermöglichen ?

Gruß Dirk


Dirk
Datum: 15.04.02 16:15 Antwortenals Email verschicken (dige@gmx.de) 


Hallo Gerd,

habe aufgrund Deiner Super Idee!! auch alle
dBase Zugriffe in ein externes Programm mit
komprimierter Runtime ausgelagert.
Die 95K mehr kann verschmerzen ;-)

Funktioniert Prima und ist auch noch schneller,
da man das Messagehandling abschalten kann...

Gruß Dirk


 Zurück zur Übersicht