AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Arraygrösse und Stack Overflow

Ein Thema von johndoe049 · begonnen am 21. Feb 2024 · letzter Beitrag vom 21. Feb 2024
Antwort Antwort
Seite 1 von 2  1 2      
johndoe049

Registriert seit: 22. Okt 2006
128 Beiträge
 
#1

Arraygrösse und Stack Overflow

  Alt 21. Feb 2024, 12:13
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...
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
213 Beiträge
 
#2

AW: Arraygrösse und Stack Overflow

  Alt 21. Feb 2024, 12:36
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.
  Mit Zitat antworten Zitat
johndoe049

Registriert seit: 22. Okt 2006
128 Beiträge
 
#3

AW: Arraygrösse und Stack Overflow

  Alt 21. Feb 2024, 12:46
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.
Hallo,

wie schaltet man das auf Heap um? Arbeitsspeicher ist genug vorhanden (ca. 196 GB Ram)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Arraygrösse und Stack Overflow

  Alt 21. Feb 2024, 13:08
.. wenn Du ein dynamisches Array nimmst, das kommt auf den Heap

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#5

AW: Arraygrösse und Stack Overflow

  Alt 21. Feb 2024, 13:12
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 array of array of array of integer mit SetLength(x, 1001, 11, 10001); .
Hier wären es dann 1001*11 Mal 10001*4 "kleine" Blöckchen im Speicher.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (21. Feb 2024 um 13:14 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Arraygrösse und Stack Overflow

  Alt 21. Feb 2024, 13:18
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;
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
213 Beiträge
 
#7

AW: Arraygrösse und Stack Overflow

  Alt 21. Feb 2024, 13:23
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
https://stackoverflow.com/questions/...uble-in-delphi

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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#8

AW: Arraygrösse und Stack Overflow

  Alt 21. Feb 2024, 13:25
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#9

AW: Arraygrösse und Stack Overflow

  Alt 21. Feb 2024, 13:31
.. wenn Du ein dynamisches Array nimmst, das kommt auf den Heap
Insbesondere kommt es in kleineren Blöcken. Lediglich die letzten array of Integer werden jeweils als ein Block benötigt. Alle anderen enthalten Pointer auf die Sub-Arrays.

Arbeitsspeicher ist genug vorhanden (ca. 196 GB Ram)
Das kommt darauf an ob es eine 32 oder 64-Bit Anwendung ist. Bei 32-Bit kann der Heap auch nicht den Hauptspeicher voll ausnutzen. Mit 400 MB in Blöcken von max. 40KB bist du aber wohl noch im grünen Bereich.

Delphi-Quellcode:
type
  PMyArray = ^TMyArray;
  TMyArray = array [0..1000] of array [0..10] of array [0..10000] of integer;
Das würde ich nicht empfehlen, da das weiterhin ein zusammenhängendes Array erzeugt - lediglich auf dem Heap. Das kann unter Win32 bei 400MB schon engwerden.

Mal abgesehen davon ließe sich das sowieso auch deutlich einfacher schreiben: TMyArray = array[0..1000, 0..10, 0..10000] of integer; Besser wäre sowas:
Delphi-Quellcode:
type
  TMyArray = array of array of array of Integer;

procedure Test;
var
  arr: TMyArray;
begin
  SetLength(arr, 1001, 11, 10001);
  ...
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
johndoe049

Registriert seit: 22. Okt 2006
128 Beiträge
 
#10

AW: Arraygrösse und Stack Overflow

  Alt 21. Feb 2024, 13:42
[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:
Mal abgesehen davon ließe sich das sowieso auch deutlich einfacher schreiben: TMyArray = array[0..1000, 0..10, 0..10000] of integer;
Wir übernehmen einen Sourcecode von einem anderen Programmierer. Bevor wir was optimieren, müssen wir das erst mal möglichst nahe umbauen. Bisher wird die Auswertung nicht im Arbeitsspeicher sondern mit Dateien auf Festplatte gemacht.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz