Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 23.05.2022, 12:03 Titel: Arraygröße - was ist möglich? |
|
|
Wie kriege ich untenstehendes Beispiel zum laufen? Was mache ich falsch?
Code: | #define AnzahlArrayElemente 500000000000
SCREENRES 640, 840, 32
DIM AS INTEGER i, j
REDIM z(0 TO AnzahlArrayElemente) AS DOUBLE
FOR z = 1 TO 500000000000
i = 1
j += 1
NEXT
SLEEP
END |
Entweder der Compiler bring eine Fehlermeldung oder das Programm schmiert ab! Es muss doch irgendwie möglich sein, dass ich so große oder noch größere Arrays definieren kann? Bei dem einen Versuch bringt der mir die Meldung: _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 23.05.2022, 19:02 Titel: |
|
|
Als erstes dürfte hier der 64-Bit-Compiler zwingendes Muss sein.
Ausserdem bitte auch einmal ausrechnen, ob das RAM bei Deinem PC/Notebook überhaupt ausreicht. Sonst brauchst Du dann schon bald einmal ein üppig ausgestatteter x86-Server wie in einem grösseren Unternehmen üblich, bei dem z.B. 512 GB und mehr nur in Form von RAM-Riegel eingebaut sind... (meistens sind dann noch mehrere Xeon-CPUs drin mit über 100 Kerne, womit man in FB so richtig viele Threads starten könnte). _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4688 Wohnort: ~/
|
Verfasst am: 23.05.2022, 19:08 Titel: |
|
|
Arbeitest du mit dem 32-Bit- oder dem 64-Bit-Compiler?
'Array to big' erhalte ich nur, wenn ich ein (statisches) DIM statt eines (dynamischen) REDIM verwende. Der Grund ist ganz einfach der, dass statische Arrays in den Stack gelegt werden, und der ist recht begrenzt. So große Arrays bekommst du da nicht rein. Bei dynamischen Arrays geht das eher.
Deine gewünschte Array-Größe ist aber größer als ein 32-Bit-Integer. Daher vermute ich, dass auch das für den 32-Bit-Compiler nicht machbar ist, weil der dafür benötigte Adressraum zu klein ist (ich hoffe, die Fachbegriffe stimmen alle). Mit dem 64-Bit-Compiler funktioniert es aber.
Wie du aber das Array z() anschließend als Laufvariable einsetzen willst, erschließt sich mir nicht.
edit: Bei meinem ersten Teil war dreael schneller. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 23.05.2022, 21:02 Titel: |
|
|
nemored hat Folgendes geschrieben: | Arbeitest du mit dem 32-Bit- oder dem 64-Bit-Compiler?
| Ich arbeite mit dem 64-bit Compiler.
Ich kriege momentan folgende Fehlermeldung:
Zitat: | Test.bas(59) error 73: Array access, index expected, before '=' in 'FOR z = 1 TO 500000000000' |
Kann also in der For Next - Schleife nicht nach oben zählen. Mir ist wichtig, dass die For Next - Schleife bis zu dem angegebenen Wert nach oben zählt! _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4688 Wohnort: ~/
|
Verfasst am: 23.05.2022, 21:11 Titel: |
|
|
z() ist ein Array, und für die Schleife brauchst du eine einzelne Variable. Du versuchst hier, die Bedeutung von z umzudefinieren.
Code: | REDIM AS DOUBLE z(0 TO 1000)
DIM AS INTEGER i
FOR i = 0 TO 1000
NEXT |
funktioniert.
Code: | REDIM AS DOUBLE z(0 TO 1000)
FOR z(0) = 1 TO 1000
NEXT |
könnte theoretisch funktionieren, mag der Compiler aber nicht, weil er eine skalare Zählervariable haben will.
Code: | REDIM AS DOUBLE z(0 TO 1000)
FOR z = 1 TO 1000
NEXT |
ergibt keinen Sinn. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 23.05.2022, 21:42 Titel: |
|
|
nemored hat Folgendes geschrieben: | z() ist ein Array, und für die Schleife brauchst du eine einzelne Variable. Du versuchst hier, die Bedeutung von z umzudefinieren.
Code: | REDIM AS DOUBLE z(0 TO 1000)
DIM AS INTEGER i
FOR i = 0 TO 1000
NEXT |
funktioniert.
Code: | REDIM AS DOUBLE z(0 TO 1000)
FOR z(0) = 1 TO 1000
NEXT |
könnte theoretisch funktionieren, mag der Compiler aber nicht, weil er eine skalare Zählervariable haben will.
Code: | REDIM AS DOUBLE z(0 TO 1000)
FOR z = 1 TO 1000
NEXT |
ergibt keinen Sinn. | Danke für die Antwort! Habe das mit dem z in der Schleife übersehen! Programm funktioniert momentan mit dem hochzählen. Ob ich auch bis zu dem angegebenen Wert komme, ist mehr als fraglich? Das müsste ich mal testen. Das Programm braucht halt ewig, bis ich nach oben gezählt habe... Keine Ahnung, ob man das noch schneller machen kann?
Funktioniert:
Code: | #define AnzahlArrayElemente 500000000000
SCREENRES 640, 840, 32
DIM AS INTEGER i, j
REDIM z(0 TO AnzahlArrayElemente) AS DOUBLE
FOR i = 1 TO 500000000000
j += 1
NEXT
SLEEP
END |
_________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4688 Wohnort: ~/
|
Verfasst am: 23.05.2022, 22:04 Titel: |
|
|
Eine hallbe Billion Schleifendurchläufe dauern halt ihre Zeit. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 24.05.2022, 13:19 Titel: |
|
|
Nur mal so nebenbei ...
REDIM z(0 TO 500000000000) AS DOUBLE
1.) 0 bis 500000000000 entsprechen 500000000000 + 1 Elemente.
2.) Bedeutet: 500.000.000.001 * SizeOf(Double) = 500.000.000.001 * 8 = 4.000.000.000.008 Byte
Das entspricht rund 4TByte !!!!!! >>RAM<< !!!!!
Allein, dass das geht müsste eigentlich unmöglich sein (Außer du hast wirklich 4TB Ram in deiner Kiste)
3.) Hinzu kommt, (solltest du wirklich 4TB Ram in deiner Kiste haben) das es zum SWAP'en kommen wird, da ein Array keine Linked-List ist, und das Array einen ZUSAMMENHÄNGENDEN Speicherbereich benötigt.
Um also diesen Bereich zu erhalten, muss das OS einen 4TB Großen Speicherbereich "frei machen". Das tut es dadurch, das es 4TB auf die Festplatte "exportiert" und im RAM für deine APP zur verfügung stellt.
Nachteilig daran ist natürlich, das zum 1. es SEHR lange dauert, bis das kopiert wurde, und 2. sobald eine andere Applikation wieder in den Vordergrund kommt (etwas tun will), das OS diesem Programm wieder seinen RAM-Speicher zur Verfügung stellen muss. Die folge -> Das OS muss wieder Speicher von der Platte ins Ram "importieren". Das geht aber nur, indem es anderen Speicher wider auf die Platte schaufelt. ...... Ich hoffe, man erkennt das Problem an dieser Sache.
Dieses Konzept nennt man übrigens MEMMAP'ing ... Das hat vor und Nachteile. Vorteil: jedes Programm kann theoretisch 100% des RAM's nutzen. Nachteil: Es kommt zum SWAP'ing (was im verhältnis EXTREM Langsam ist).
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 24.05.2022, 23:09 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: | Nur mal so nebenbei ...
REDIM z(0 TO 500000000000) AS DOUBLE
1.) 0 bis 500000000000 entsprechen 500000000000 + 1 Elemente.
2.) Bedeutet: 500.000.000.001 * SizeOf(Double) = 500.000.000.001 * 8 = 4.000.000.000.008 Byte
Das entspricht rund 4TByte !!!!!! >>RAM<< !!!!!
Allein, dass das geht müsste eigentlich unmöglich sein (Außer du hast wirklich 4TB Ram in deiner Kiste)
3.) Hinzu kommt, (solltest du wirklich 4TB Ram in deiner Kiste haben) das es zum SWAP'en kommen wird, da ein Array keine Linked-List ist, und das Array einen ZUSAMMENHÄNGENDEN Speicherbereich benötigt.
Um also diesen Bereich zu erhalten, muss das OS einen 4TB Großen Speicherbereich "frei machen". Das tut es dadurch, das es 4TB auf die Festplatte "exportiert" und im RAM für deine APP zur verfügung stellt.
Nachteilig daran ist natürlich, das zum 1. es SEHR lange dauert, bis das kopiert wurde, und 2. sobald eine andere Applikation wieder in den Vordergrund kommt (etwas tun will), das OS diesem Programm wieder seinen RAM-Speicher zur Verfügung stellen muss. Die folge -> Das OS muss wieder Speicher von der Platte ins Ram "importieren". Das geht aber nur, indem es anderen Speicher wider auf die Platte schaufelt. ...... Ich hoffe, man erkennt das Problem an dieser Sache.
Dieses Konzept nennt man übrigens MEMMAP'ing ... Das hat vor und Nachteile. Vorteil: jedes Programm kann theoretisch 100% des RAM's nutzen. Nachteil: Es kommt zum SWAP'ing (was im verhältnis EXTREM Langsam ist).
MfG
TPM | Ich bin auf jeden Fall schon mal bis 3000000000 oder 4000000000 gekommen. So weit hat mein Programm hochgezählt! Dauerte ungefähr ca. 4h? Ca. 6 Tage dauert es, bis ich bei dem in dem Quellcode genannten Wert angekommen bin. Habe ich mal grob ausgerechnet. Keine Ahnung wie viel meine Kiste an Ramspeicher hat? Ich muss mir dann halt für das was ich programmieren wollte, eine andere Strategie überlegen, sofern das überhaupt möglich ist?
Edit: 8 Gb Ram zeigt mein Rechner an. _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 24.05.2022, 23:59 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: | 2.) Bedeutet: 500.000.000.001 * SizeOf(Double) = 500.000.000.001 * 8 = 4.000.000.000.008 Byte
Das entspricht rund 4TByte !!!!!! >>RAM<< !!!!!
Allein, dass das geht müsste eigentlich unmöglich sein (Außer du hast wirklich 4TB Ram in deiner Kiste) |
Exakt auf diese Thematik wollte auch ich hier hinausgehen.
Auf dicken, fetten Servern im 19 Zoll-Rack sind solche grossen RAM-Speichermengen keine Seltenheit. z.B. auf einem ERP-Server in einer grösseren Firma (solche kann ich u.a. über meine Firma auch betreuen), wo mehrere hundert Benutzer drüber arbeiten, ist dies keine Seltenheit, dass deren virtueller Server 256 GB nur RAM besitzt und 128 CPU-Kerne. => Der verwendete physikalische Host mit dem Hypervisor (meist VMware, aber nicht Workstation/Player, wie ihn der eine oder andere von Euch kennt, sonster ESX/vSphere) besitzt dann durchaus einmal 1 TB nur RAM.
Für FreeBasic reicht dann ein reguläres Windows 10 bereits nicht mehr aus, da muss es schon das Windows Server-Betriebssystem sein. Oder alternativ natürlich ein Linux, um all dieses viele RAM adressieren zu können. Auf so einer üppigen Kiste könntet Ihr dann problemlos ein derart riesiger Prozess mit FreeBasic starten.
Sinnvollerweise muss es hier zwingend 64-Bit sein, weil sich ja bei 32-Bit nur maximal 4 GB RAM adressieren lassen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
pzktupel

Anmeldungsdatum: 07.07.2020 Beiträge: 85
|
Verfasst am: 25.05.2022, 09:31 Titel: |
|
|
Ganz genau, selbst wenn man mit 500 Mrd ein Bitfeld (über UBYTE) aufspannt , sind 62,5 GB RAM. Double reserviert mehr als nur ein Byte....soviel RAM wird Dein PC nicht haben und deshalb meckert der Compiler vorab. _________________ Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 25.05.2022, 19:34 Titel: |
|
|
pzktupel hat Folgendes geschrieben: | Ganz genau, selbst wenn man mit 500 Mrd ein Bitfeld (über UBYTE) aufspannt , sind 62,5 GB RAM. Double reserviert mehr als nur ein Byte....soviel RAM wird Dein PC nicht haben und deshalb meckert der Compiler vorab. | Der Compiler meckert eigentlich nicht? Gepostetes Beispiel läuft. Ich muss nur aus dem z ein i machen. Ich habe aber dann selber nach ca. 4h abgebrochen, da die Zeit zu lang war. Ich war zum Zeitpunkt des Abbruches bei über 3000000000 Schleifendurchläufe! _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 25.05.2022, 19:37 Titel: |
|
|
ALWIM hat Folgendes geschrieben: | ... Ich muss nur aus dem z ein i machen. ... |
häääää?
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 25.05.2022, 19:39 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: | ALWIM hat Folgendes geschrieben: | ... Ich muss nur aus dem z ein i machen. ... |
häääää?
MfG
TPM |
Fehler:
Code: | FOR z = 1 TO 500000000000
i = 1
j += 1
NEXT |
richtig:
Code: | FOR i = 1 TO 500000000000
j += 1
NEXT |
_________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 25.05.2022, 19:45 Titel: |
|
|
Öm .. naja .. wenn du das auf deinen vorherigen Code beziehst: ...
Code: | #define AnzahlArrayElemente 500000000000
SCREENRES 640, 840, 32
DIM AS INTEGER i, j
REDIM z(0 TO AnzahlArrayElemente) AS DOUBLE
FOR i = 1 TO 500000000000
j += 1
NEXT
SLEEP
END |
dann ist das ja auch richtig, mit dem Fehler.
Du kannst ja nicht:
Code: | For (ARRAY) = 1 To (ZAHL) |
machen.
Denn, z ist ja von dir zuvor mit REDIM als Array und nicht als integer definiert worden.
MfG
TPM
PS: Ne Frage nebenbei ... Lässt sich ReDim überhaupt ohne ein vorheriges Dim (sauber) ausführen? _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4688 Wohnort: ~/
|
Verfasst am: 25.05.2022, 20:23 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: | PS: Ne Frage nebenbei ... Lässt sich ReDim überhaupt ohne ein vorheriges Dim (sauber) ausführen? |
Ja, musst du sogar - du kannst entweder ein DIM array() oder REDIM array() oder REDIM array(index) verwenden, dann ist das Array dynamisch. Mit einem DIM array(index) ist das Array statisch und lässt sich nicht mehr REDIMen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 25.05.2022, 21:48 Titel: |
|
|
Ich meinte eigentlich etwas in der Art:
Code: | Dim abc() as string 'Ohne dies hier
redim abc(10) as string |
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4688 Wohnort: ~/
|
Verfasst am: 25.05.2022, 21:56 Titel: |
|
|
Ja, die zweite Zeile allein funktioniert und ist auch so vorgesehen. Ich habe dazu keine Memory-Checks gemacht (außer dass es bei mir noch nie Probleme gab), aber das Wiki beschreibt die Funktionsweise genau so.
Zitat: | Redim can be used to define new variable-length arrays, or resize existing variable-length arrays while keeping the same number of dimensions. Redim always produces variable-length arrays, so, unlike Dim, variable-length arrays can be defined with constant subscripts. |
https://www.freebasic.net/wiki/KeyPgRedim _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|