Xbase++ MEMORY() Array / RAM max. ?

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12036
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Xbase++ MEMORY() Array / RAM max. ?

Beitrag von AUGE_OHR » Mo, 11. Feb 2019 8:32

moin,

Frage : wie viel Arbeitsspeicher kann sich Xbase++ nehmen und wie kann ich eine max. Belastung erreichen ?

ich wollte die MEMORY() Function testen und hatte Problem mit ARRAY > 1024x1024 mit Inhalt String von 1000 Byte ?
also habe ich mit LINK_FLAGS = /ST:5000000,100000 das ganz erhöht un jetzt ging es in einer Schleife auch weiter ... aber nicht so weit wie erhofft.

nach gut 20 Durchgängen wurde er deutlich langsamer und paar Runden weiter und ist dann abgestürzt :(
die Fehlermeldung sah ungefähr so aus

Code: Alles auswählen

Xbase++ version     : Xbase++ (R) Version 1.90.355
Operating system    : Windows  10.00 Build 17763
Memory (RAM_AVAIL)  : 2097.15 of 2097.15 MB
DiskSpace D:        : 482889.42 MB
Alias()             : leer
Recno()             : leer
Found()             : NO
NetError()          : NO
Select()            : 1
IndexOrd()          : 0
WorkSpaceList       : 
------------------------------------------------------------------------------

------------------------------------------------------------------------------
oError:args         :
          -> VALTYPE: O CLASS: thread
oError:canDefault   : N
oError:canRetry     : N
oError:canSubstitute: N
oError:cargo        : NIL
oError:description  : Nicht genügend Speicher
oError:filename     : 
oError:genCode      :         15
oError:operation    : init
oError:osCode       :          0
oError:severity     :          2
oError:subCode      :       1005
oError:subSystem    : BASE
oError:thread       :          1
oError:tries        :          0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Called from XCM:CHECKVIEW(4916)
Called from MAIN(507)
------------------------------------------------------------------------------
Thread          1
------------------------------------------------------------------------------
{1, 1012, 532, "ERRORLOG", thread}
{4, 2312, NIL, NIL, NIL}
Ich war irretiert weil die Fehlermeldung von MEMORY() 2097.15 of 2097.15 MB anzeigt ... aber das war doch auf einem 64Bit OS ?

also habe ich eine Demo geschrieben und daraus ist nun das geworden
! Anmerkung : siehe PDR 6238 Hotfix 34 (oder 36 oder 50) und PDR 6409

Frage : wie viele Durchgänge schafft Ihr ?
MEMORY.ZIP
pure Xbase++ Source
(1.41 KiB) 38-mal heruntergeladen
gruss by OHR
Jimmy

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 13487
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Xbase++ MEMORY() Array / RAM max. ?

Beitrag von Jan » Mo, 11. Feb 2019 9:16

Jimmy,

Arrays sind etwas schwierig. Einerseits mag Xbase++ es gar nicht, ein sehr großes Array auf einen Schlag anzulegen. Das muß man nach und nach per AAdd() groß ziehen. Andererseits ist die Arraygröße auch begrenzt. Danach gibt es einen Laufzeitfehler. Alaska bietet dafür einen Workaround - in die .arc muß ein Eintrag CDF_MOM_HANDLESPACE_ID = nArraygröße. Aber auch hier ist das auf 9999999 Elemente begrenzt. Es geht hier um die Anzahl der Elemente, nicht um die eigentliche Arraygröße.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12036
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Xbase++ MEMORY() Array / RAM max. ?

Beitrag von AUGE_OHR » Mo, 11. Feb 2019 10:04

Jan hat geschrieben:
Mo, 11. Feb 2019 9:16
Alaska bietet dafür einen Workaround - in die .arc muß ein Eintrag CDF_MOM_HANDLESPACE_ID = nArraygröße. Aber auch hier ist das auf 9999999 Elemente begrenzt. Es geht hier um die Anzahl der Elemente, nicht um die eigentliche Arraygröße.
interessant ...

habe es ausprobiert
MEMORY.ARC(23:32) : error: Syntax Fehler CDF_MOM_HANDLESPACE_ID = 9999999
MEMORY.ARC: 1 Fehler.
'arc /v "MEMORY.ARC"' returned error 2
was mache ich falsch ?
gruss by OHR
Jimmy

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12036
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Xbase++ MEMORY() Array / RAM max. ?

Beitrag von AUGE_OHR » Mo, 11. Feb 2019 10:24

ich füge die Elemente per AADD() hinzu. klar ist die Anzahl 2^31 Elemente die Grenze für ein 32bit Array

zunächst hatte ich ein 2-Dim Element verwendet

Code: Alles auswählen

   cText := REPLICATE("X",1024)
   AADD(aBig1,{cText,cText})
aber da knallte es schon im 2nd Durchgang.
also habe ich reduziert auf

Code: Alles auswählen

   AADD(aBig1,cText)
und damit schaffe ich ca. 20 Durchgänge mit 1024x1024 Elementen was jeweils ca. 20 MB ausmacht
klar schaffe ich nur mit der richtigen STACK Einstellung überhaupt einen 2nd Durchgang ... probiert es mal mit dem Source

---

habe

Code: Alles auswählen

   cText := REPLICATE("X",1024)
um Faktor 100 erhöht

Code: Alles auswählen

   cText := REPLICATE("X",102400)
geht so ein langer String überhaupt ... :?:
egal es ändert sich dadurch nichts (?) am Speicher Verbrauch (sagt MEMORY() )
22020096 <- Länge Array
Für den Prozeß verfügbarer Gesamtspeiche : 1271
Freier Speicher für den aktuellen Prozeß : 851
Xbase++ App nutzt : 420
Count 22

Error nach 22 Durchlõufen

10:19:22 nach 144.38

Für den Prozeß verfügbarer Gesamtspeiche : 1271
Freier Speicher für den aktuellen Prozeß : 847
Xbase++ App nutzt : 424

Press any key to continue...
gruss by OHR
Jimmy

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 13487
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Xbase++ MEMORY() Array / RAM max. ?

Beitrag von Jan » Mo, 11. Feb 2019 10:33

Jimmy,

Du brauchst dafür die cdf.ch. Hab ich aber gerade nicht zur Hand (mein Kunde, bei dem ich gerade bin, hat diese Probleme mit übergroßen Arrays nicht). Frag mal bei Alaska nach.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12036
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Xbase++ MEMORY() Array / RAM max. ?

Beitrag von AUGE_OHR » Mo, 11. Feb 2019 12:30

habe den String auf 100 MB (!) erhöht und die Schleife auf 1000x1000 geändert.
damit macht er nun 21 Durchläufe
Xbase++ App nutzt : 116
Xbase++ App nutzt : 136
Xbase++ App nutzt : 155
Xbase++ App nutzt : 174
...
Error nach 21 Durchläufen

Länge Array : 20561099
2100,00 MB

Für den Prozeß verfügbarer Gesamtspeicher : 1271
Freier Speicher für den aktuellen Prozeß : 781
Xbase++ App nutzt : 490
man muss also riesige Strings als Element (1-Dim) nutzen um maximal ca. 2.1 GB in den Speicher zu bekommen.

p.s. kein Unterschied bei 32bit/64bit sowie Windows 7/8/10
gruss by OHR
Jimmy

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12036
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Xbase++ MEMORY() Array / RAM max. ?

Beitrag von AUGE_OHR » Mo, 11. Feb 2019 13:43

Nachtrag : habe den String selbst mal verändert ...

Code: Alles auswählen

LOCAL nChr   := RandomInt( 65,90 ) // A-Z
LOCAL nMax   := 102400000
LOCAL cText  := REPLICATE(CHR(nCHR),nMax) // 100MB String
damit gelingen nur knapp 8 Durchläufe ... hm ... :-k
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14829
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Xbase++ MEMORY() Array / RAM max. ?

Beitrag von brandelh » Mo, 11. Feb 2019 13:49

also mit memoread() oder meiner File2str() kann ich normal 400 bis 500 MB Dateien in den Speicher laden, mehr geht auch beim MED Editor (egal ob 32 / 64 Bit ) nicht, ohne dass er abschmiert.
Allerdings war die Verarbeitung (Aufteilung) des Strings dann langsamer als den in 4 K Blöcken mit meiner TxtReader Klasse einzulesen. (8 GB tatsächlicher Speicher in i5 mit Win 7 Pro 64 bit)
Gruß
Hubert

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12036
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Xbase++ MEMORY() Array / RAM max. ?

Beitrag von AUGE_OHR » Mo, 11. Feb 2019 15:05

hi,

mit FRead() hab ich auch schon in grösseren Dimensionen gearbeitet.
nun arbeite ich mit einem 1000x1000 Elemente Array aber auch nur 1-DIM

wenn ich auf 2-DIM gehe muss ich um Faktor 10 auf 100x100 runter damit er überhaupt einen Durchgang schafft.

Code: Alles auswählen

   FOR i := 1 TO 100
      FOR j := 1 TO 100
         AADD(aBig1,{nCount,i,j,cText})
Error nach 13 Durchläufen

Länge Array : 120000
1200,00 MB

Für den Prozeß verfügbarer Gesamtspeicher : 1271
Freier Speicher für den aktuellen Prozeß : 86
Xbase++ App nutzt : 1185
hier nutzt die Xbase++ App auch mehr den vorhandenen Speicher (laut MEMORY())

hm ... wo "bleiben" die 100 MB ... 100x100 x100 MB x 12 :?:
gruss by OHR
Jimmy

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12036
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Xbase++ MEMORY() Array / RAM max. ?

Beitrag von AUGE_OHR » Fr, 07. Jun 2019 23:44

zu PDR 6409 MEM_RAM_TOTAL

laut Alaska wird immer nur 2 GB MEM_RAM_TOTAL angegeben.
Windows zeigt bei einem 32 BIT OS aber ca. 3 GB an !

das Problem in der MEMORYSTATUSEX Structure ist der Type DWORDLONG
https://docs.microsoft.com/de-de/window ... rystatusex

laut Pablo geht es so mit ot4xb
#xcommand MEMBER DWORDLONG <cm> => MEMBER DWORD64 <cm>
in the structure, this point directly to the 8 raw bytes holding the int 64 number
ot4xb.public
2. Juni 2019
> 2GB RAM ?

---
gruss by OHR
Jimmy

Antworten