![]() |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 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