![]() |
Arraygrösse und Stack Overflow
Hallo,
wir haben im Moment einen Stack Overflow, wenn wir ein "kleines" Array definieren. array [0..1000] of array [0..10] of array [0..10000] of integer Brauchen wir für eine Selektionsberechnung. Array ist derzeit statisch definiert. Würde das bei einem dynamischen Array funktionieren? Eigentlich brauchen wir das noch grösser, aber Datenbank auf SSD ist langsamer als der Arbeitsspeicher... |
AW: Arraygrösse und Stack Overflow
Hi,
This small array ("kleines") made me spill my coffee ! The size of this "Small" is 1001*11*10001 = 110121011 element then for integers 110121011 * 4 = 440484044 byte , and this is more than 400 Megabyte ! So, no the stack will no hold that, you have to switch to dynamic arrays and it will (or might) work if you have enough RAM to allocate such continuous allocation. Or if possible divide the calculation process into real small pieces, even then don't use the stack allocated, use the heap. |
AW: Arraygrösse und Stack Overflow
Zitat:
wie schaltet man das auf Heap um? Arbeitsspeicher ist genug vorhanden (ca. 196 GB Ram) |
AW: Arraygrösse und Stack Overflow
.. wenn Du ein dynamisches Array nimmst, das kommt auf den Heap
Grüße Klaus |
AW: Arraygrösse und Stack Overflow
Ein statisches Array, als lokale Variable, liegt nunmal direkt auf dem Stack, so wie alle lokalen Variablen.
* ja, den Stack kann man vergrößern, aber 400 MB wäre sowieso nicht möglich * also nein, besser ist es das Array eben nicht dort zu haben. z.B. als dynamisches Array oder als Pointer im Heap (sonstwo im virtuellen Programm-Speicher) Dann ist es sowieso schwer, einen zusammenhängenden Block dieser Größe in einem 32 Bit-Programm reservieren zu wollen. (hast da standardmäßig nur 2 GB und das auch nicht relativ schön fragmentiert) Erfahrungsgemäß geht es bis 700MB "meistens" noch gut, aber absichtlich provozieren würde ich das nicht wollen. * Vielleicht also besser komplett anders herangehen. Ist das Array überhaupt zum Großzeil mit Daten gefüllt? Wenn nicht, dann besser als Liste/Dictonary. * oder als mehrdimensionals dynamisches
Delphi-Quellcode:
mit
array of array of array of integer
Delphi-Quellcode:
.
SetLength(x, 1001, 11, 10001);
Hier wären es dann 1001*11 Mal 10001*4 "kleine" Blöckchen im Speicher. |
AW: Arraygrösse und Stack Overflow
Oder auch so:
Delphi-Quellcode:
type
PMyArray = ^TMyArray; TMyArray = array [0..1000] of array [0..10] of array [0..10000] of integer; procedure TestMyArray; var MyArray: PMyArray; begin New(MyArray); try finally Dispose(MyArray); end; end; |
AW: Arraygrösse und Stack Overflow
Hallo,
wie schaltet man das auf Heap um? Arbeitsspeicher ist genug vorhanden (ca. 196 GB Ram)[/QUOTE] As Klaus said, dynamic allocations are on the heap (array or whatever). You may want to look at the answers for this question ![]() As for more in depth details, i think there is many here will not suffer from language barrier to explain any more questions you might have. Personally i would stay from generics and anonymous methods when there is complex and long calculations, mostly to keep it simple and readable. Also you can might consider separate you construct (your data build) to array of matrixes, this way you will not need one big continuous piece of RAM to fit it, this might be easier to manage and will lead to more readable code, but this is personal choice. |
AW: Arraygrösse und Stack Overflow
Wie bereits gesagt wurde,
z.B. als Variable in einem Objekt, oder als Pointer auf dein Array (New, GetMem, GetMemory, ...) oder eben als dynamisches Array (welches intern ein Pointer ist) |
AW: Arraygrösse und Stack Overflow
Zitat:
Delphi-Quellcode:
werden jeweils als ein Block benötigt. Alle anderen enthalten Pointer auf die Sub-Arrays.
array of Integer
Zitat:
Zitat:
Mal abgesehen davon ließe sich das sowieso auch deutlich einfacher schreiben:
Delphi-Quellcode:
Besser wäre sowas:
TMyArray = array[0..1000, 0..10, 0..10000] of integer;
Delphi-Quellcode:
type
TMyArray = array of array of array of Integer; procedure Test; var arr: TMyArray; begin SetLength(arr, 1001, 11, 10001); ... end; |
AW: Arraygrösse und Stack Overflow
[QUOTE=himitsu;1533737]
* Vielleicht also besser komplett anders herangehen. Ist das Array überhaupt zum Großzeil mit Daten gefüllt? Wenn nicht, dann besser als Liste/Dictonary. Leider ja. Es werden Vorselektionen aus einer Datenmenge von ca. 18.000.000 Daten in Chargen Daten zusammengefasst und dann die jeweiliga Abweichungen/Gleichheiten ermittelt und gruppiert. Das ganze solange, bis alle Daten geprüft wurden. Dann werden die Gruppen geprüft und irgendwann kommt als Ergebniss eine Produktionsabweichungsanalyse heraus. Mit so einer Datenmenge hatten wir bisher nichts gemacht. Anwendung ist 64bit. Sollte mit dem Arbeitsspeicher kein Problem sein. Zitat:
|
AW: Arraygrösse und Stack Overflow
Zitat:
Delphi-Quellcode:
und TMyArray = array [0..1000] of array [0..10] of array [0..10000] of integer;
Delphi-Quellcode:
sind syntaktisch dasselbe. Das hat nichts mit optimieren zu tun.TMyArray = array[0..1000, 0..10, 0..10000] of integer; Zitat:
|
AW: Arraygrösse und Stack Overflow
Zitat:
Wir haben dieses kleine Array bisher im Sourcecode an verschiedenen Funktionen gefunden. Erstmal rausfinden, was der überhaupt programmiert hat. Es gibt auch noch Funktionen, die etwas 2000 Zeilen haben. Dokumentation gibt es nicht. Nur das Free Pascal Projekt, das wir auf Delphi umsetzen sollen. |
AW: Arraygrösse und Stack Overflow
Jupp, unterschiedliche Syntax, aber technisch gesehn, sind die Beiden identisch.
Delphi-Quellcode:
Rein von den Daten her ist es sogar gleich/kompatibl zu
xxx: array[0..9] of array[0..9] of Byte;
xxx: array[0..9, 0..9] of Byte;
Delphi-Quellcode:
xxx: array[0..99] of Byte;
ABER, leider ist teilweise das Letzte auch für den Compiler das Selbe. :wall: ![]() Bei statischen Arrays liegen die Daten der Felder immer hintereinander (zusammenhängend). Bei dynamischen Arrays stehen nur die Referenzen hintereinander, aber die einzelnen Daten liegen verteilt im Arbeitsspeicher. Die Daten eines
Delphi-Quellcode:
sind direkt im Typ gespeichert und beim
array[..] of Xyz;
Delphi-Quellcode:
noch mit einem Pointer dazwischen.
array of Xyz;
Delphi-Quellcode:
zeigt bei dynamisch und statisch auf die Daten.
@Arr[0]
Delphi-Quellcode:
kommt beim Statischen auf's Gleiche raus, aber beim Dynamischen zeigt es auf den "internen" Array-Pointer.
@Arr
Und bei
Delphi-Quellcode:
das Gleiche,
array of array of ...
Delphi-Quellcode:
liegen auch die SubArrays hintereinander,
array[..] of array[..] of ...
Delphi-Quellcode:
bzw
array[..] of array of ...
Delphi-Quellcode:
die SubArrays natülich verteilt liegen.
array of array of ...
Kanst das mit Record und Object vergleichen. (so gesehn ist ein Object ein Record mit einem interen Pointer) |
AW: Arraygrösse und Stack Overflow
Liste der Anhänge anzeigen (Anzahl: 1)
I would use something like this
Code:
I think accessing such nested data with M[i][j, k] easier to read and write.
type
TMatri = array of array of Integer; TMatrixArr = array of TMatri; var M: TMatrixArr; i, j, k: Integer; const DIM1 = 3; DIM2 = 4; DIM3 = 5; begin SetLength(M, DIM1); for I := Low(M) to High(M) do // or // for i := 0 to DIM1-1 do begin SetLength(M[i], DIM2, DIM3); for j := 0 to Pred(DIM2) do // or // for j := 0 to DIM2-1 do for k := 0 to Pred(DIM3) do // or // for k := 0 to DIM3-1 do M[i][j, k] := Abs(k - j); end; Anhang 56667 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz