Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Arraygröße - was ist möglich?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 23.05.2022, 11:03    Titel: Arraygröße - was ist möglich? Antworten mit Zitat

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:
Zitat:
Array too big

_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 23.05.2022, 18:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 23.05.2022, 18:08    Titel: Antworten mit Zitat

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. lächeln
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 23.05.2022, 20:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 23.05.2022, 20:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 23.05.2022, 20:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 23.05.2022, 21:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 24.05.2022, 12:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 24.05.2022, 22:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 24.05.2022, 22:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 81

BeitragVerfasst am: 25.05.2022, 08:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 25.05.2022, 18:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 25.05.2022, 18:37    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
... Ich muss nur aus dem z ein i machen. ...

häääää?


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 25.05.2022, 18:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 25.05.2022, 18:45    Titel: Antworten mit Zitat

Ö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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 25.05.2022, 19:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 25.05.2022, 20:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 25.05.2022, 20:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz