Probleme mit sehr großem Array
-
Hey
Ich hab Probleme mit meinem Array das mit 120mio Feldern wohl wirklich sehr groß sein soll. Warum es so groß sein soll ? Da ich die Berechnung von Pokerhänden bei denen am Schluss 7 Karten sind belschleunigen wollte (weil mir das anders viel zu lange gedauert hat) indem ich gleich im Vorfeld alle Möglichkeiten berechne. So genug gelabert fürs erste ^^
int a = 1; int b = 1; int c = 1; int d = 1; int e = 1; int f = 1; while ( a < 52 ) { Handspeicher[a] = new char*****[52]; //2 while ( b < 52 ) { Handspeicher[a][b] = new char****[52]; //3 while ( c < 52 ) { Handspeicher[a][b][c] = new char***[52]; //4 while ( d < 52 ) { Handspeicher[a][b][c][d] = new char**[52]; //5 while ( e < 52 ) { Handspeicher[a][b][c][d][e] = new char*[52]; //6 while ( f < 52 ) { Handspeicher[a][b][c][d][e][f] = new char[52]; //7 f++; } e++; f = e + 1; } d++; e = d + 1; f = e + 1; } c++; d = c + 1; e = d + 1; f = e + 1; } b++; c = b + 1; d = c + 1; e = d + 1; f = e + 1; } a++; b = a + 1; c = b + 1; d = c + 1; e = d + 1; f = e + 1; }Das werden dann 18,2mio Durchläufe und 120mio Felder
am Schluss sollein das Array Handspeicher[52][52][52][52][52][52][52]
rauskommen (also so ungefähr denn alle Plätze werden ja nicht belegt)^^. Also zunächstmal bin ich etwas verwirt denn 120.000.000 *char(1byte) wären meiner Rechnung nach 120MB was zwar wohl nicht ohne ist aber meiner meinung nach noch vertretbar ist oder irre ich mich da ^^ und was mich noch wunder das der Taskmanager eine ganz andere Zahl anzeigt (bevor der code auch nur annähernd durchgelaufen ist).Wie oben erwähnt mache ich das um die Berechnung zu beschleunigen
da mein programm 0.5sec gebraucht hat um 2 Karten zu vergleichen und das Berechnungsprogramm Pokerstove nur einen Bruchteil davon( ich glaub zwar nicht das es das andere Programm so macht aber irgedwie muss es doch schneller gehn).Ich bin für Anregungen aller Art froh denn momentan weiß ich nicht weiter was ich machen soll.
Als umgebung hab ich visual Studio 2005
-
ich sehe hier kein großes Array - nur einen Haufen kleine Arrays.
387659012 Arrays aus jeweils 52 pointern - insgesamt ca. 150GB bei 64-bit-Pointern
dazu 19770609664 Arrays aus je 52 byte - insgesamt etwa 957.5 GB
Ein durchschnittlicher Rechner wird da ein paar Probleme haben
-
Also 52^7 ergibt nach meiner Rechnung 1028071702528 Byte
was einem ganzen Terrabyte entspricht (Ich hoffe mal
das nicht ich mich jetzt verrechnet habe).Es gab vor einiger Zeit hier mal einen ziemlich
ausführlichen Thread wie man soetwas am Besten implementiert.
Ich weis die Suche funktioniert nicht richtig.
Aber vll. findest du über google etwas.//EDIT
http://www.c-plusplus.net/forum/viewtopic-var-t-is-192312-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html
Das war er. vll. findest du hier einen besseren Ansatz.
-
@ camper du hast natürlich recht es ist kein großes Array aber ein großes dynamisches Array? naja egal
mit den Pointer könntest du recht haben die sind warscheinlich wirklich größer als 1 byte aber 64bit ?
also auf meinem system müssten das 32bit sein (natürlich systemabhängig).
Wie kommst du eigentlich auf 387659012 ? die 52^6 sind auch nicht ganz richtig weil ich doppelte Karten auslasse. Das mit den 4byte Adressen erklärt nun wohl das mehr an platzbedarf(ich hab mir irgedwie gedacht das dafür nur ein byte für das char belegt wird). Nun bleibt aber die Frage wie ich das kleiner bekomm bzw überhaupt realisierbar ist ?@Storm.Xapek.de mit 52^7 kann man hier nicht rechnen da ich ja doppelte Hände ausgeschlossen habe und das mit den 120mio Feldern und 18 mio Durchläufen schon stimmen müsste (habs mit Zählern getestet). In dem Thread geht es zwar tatsächlich um das gleiche problem sogar mit dem gleichen ziel ^^ aber eine lösung wurde da ja nicht gefunden

trotzdem danke für die schnellen Antworten

-
oh ja, den ganzen Teil nach den news hab ich gar nicht gelesen - for-Schleifen wären hier wirklich übersichtlicher.
Dann sind das immer noch (ich war faul und hab den Compiler gefragt) 2643315 Allokationen für Pointerarrays aus je 52 Pointern - also mindestens je 208 Bytes, wenn man 32-bit -Zeiger zugrunde legt: insgesamt also 549809520 Bytes = 524MB + Overhead
Dazu 18260636 Allokationen für char-Arrays aus je 52 chars. mithin insgesamt 949553072 = 905.5MB + Overhead
Der Gesamtspeicherverbrauch liegt damit bei etwa 1.4 GB