Autor |
Beitrag |
FabianS
Hält's aus hier
Beiträge: 8
Microsoft Windows 98SE
Delphi 6 Personal
|
Verfasst: So 30.01.05 16:34
Hi!
Ich habe folgendes Problem. Ich habe ein dreidimensionales Array.
Delphi-Quelltext 1: 2: 3: 4: 5:
| TYPE TMatrix = Array[0..100, 0..100, 0..100] of SmallInt;
...
VAR Matrix: TMatrix; |
wie kann ich jetzt ein dynamisches Array erzeugen, welches mir erlaubt zur Laufzeit des Programmes die Array-Werte zu setzen.
Ich möchte nämlich ein Array erstellen, welches 1024^3 werte speichern kann.
-Geht das, was ich vorhabe gar nicht über TYPE definitions?
-Sollte ich Pointer verwenden? Wenn JA, wie macht man das? (bitte hier genauere Erklärung)
Mit freundlichen Grüßen,
FabianS
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt.
|
|
FabianS
Hält's aus hier
Beiträge: 8
Microsoft Windows 98SE
Delphi 6 Personal
|
Verfasst: So 30.01.05 16:58
habe etwas noch gefunden und folgendes erarbeitet:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| TYPE TMatrix = Array of Array of Array of Integer;
VAR Matrix: TMatrix;
Anzahl := 1000;
SetLength(Matrix,Anzahl); for counter1 := 0 to (anzahl-1) do begin SetLength(Matrix[counter1],Anzahl); for counter2 := 0 to (anzahl-1) do begin SetLength(Matrix[counter1,counter2], Anzahl); end; end; |
wäre das dann die art, ein dreidimensionales array zu erzeugen, welches die dimensionen der grösse der variable "Anzahl" hat?
Moderiert von raziel: Code- durch Delphi-Tags ersetzt.
|
|
Johannes Maier
Beiträge: 173
Win XP
D7 Prof
|
Verfasst: So 30.01.05 17:47
Ich kenne mich damit auch nicht sehr gut aus, aber der Code zur Erzeugung stimmt schon.
Ich denke nur, dass es kein Array mit 1000^3 Dimensionen ist sondern eins mit 3 Dimensionen und dem "Fassungvermögen" (wie nennt man das?) 1000000000.
Achja, wenn du weißt, dass es 1024*1024*1024 groß sein soll, wieso machst du es dann nicht mit dem Code aus dem oberen Posting, oder hab ich das was falsch verstanden?
_________________ MfG
Johannes ehem. jbmaier
|
|
FabianS
Hält's aus hier
Beiträge: 8
Microsoft Windows 98SE
Delphi 6 Personal
|
Verfasst: So 30.01.05 17:50
meine güte, sorry. ich stifte ja immer heillose verwirrung mit dem was ich sage. sicher hast du völlig recht. ich wollte auch NCIHT 1000^3 DIMENSIONEN schaffen, sondern nur 1000^3 mögliche werte die setztbar sind. (du nennst es fassungsvermögen... kA wie's richtig heißt..^^)
danke!
mfg fabian
|
|
I.MacLeod
Beiträge: 109
|
Verfasst: So 30.01.05 18:03
Nja... eigentlich sollte das so funktionieren:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| var foo: array of array of array of TBar;
...
SetLength(foo, 1024, 1024, 1024); |
Aber du solltest auch bedenken, dass du so schon 1 GB an RAM verbrauchst, wenn du nur ein byte für jede Position reservierst (zzgl. Referenz- & Längenzähler).
|
|
tommie-lie
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: So 30.01.05 19:38
I.MacLeod hat folgendes geschrieben: | Aber du solltest auch bedenken, dass du so schon 1 GB an RAM verbrauchst, wenn du nur ein byte für jede Position reservierst (zzgl. Referenz- & Längenzähler). |
Es muss nicht 1GB RAM sein, es reicht schon, wenn soviel logischer Speicher zur Verfügung steht (über das Swapping/Paging-System). Allerdings habe ich das eben mal ausprobiert, es dauert ewig, 1GB zu allokieren, selbst wenn man 512MB RAM hat, denn der Festplattenzugriff ist schon enorm. Allerdings kann man das Array nicht auf dem Stack erzeugen, denn der kann nur 16MB groß sein.
Mit Pointern und einem einzigen Speicherblock spart man zwar ein bisschen Overhead, aber bei einem Gigabyte Daten kommt es auf 8MB auch nicht mehr an...
Du solltest dir lieber Gedanken darüber machen, ob du wirklich solche Mengen brauchst, denn irgendwie tippe ich bei sowas immer auf Design-Flaw...
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
FabianS
Hält's aus hier
Beiträge: 8
Microsoft Windows 98SE
Delphi 6 Personal
|
Verfasst: So 30.01.05 23:45
wie könnte ich denn sonst eine solche enorme matrix realisieren?
ich meine ich könnte das array auch vom typ boolean machen. das wäre auch ok. würde das weniger speicherplatz nehmen?
oder wie gesagt: sollte/kann man da was mit pointer machen, wenn ja, wie?
mfg fabian
p.s. ich muss nur zwei verschiedene werte (0 oder 1) auf die punkte setzen können. wie würde ich denn dann das nur nehmen? also ich sehe ein, das der Integer-Typ eine schlechte wahl ist!
|
|
Motzi
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mo 31.01.05 00:02
Also ein Array für 1024^3 Werte, wobei jeder Wert ein 4Byte Integer ist würde 4GB benötigen.. selbst wenn du anstatt eines Integers Booleans nehmen würdest würdest du auf 1GB kommen. Aber auch wenn der Adressraum eines Prozesses 4GB groß ist und du genügend RAM und eine ausreichend große Auslagerungsdatei hast wirst du wohl kaum einen 1GB großen Array verwenden können, da du (aufgrund der Fragmentierung) in deinem Adressraum kaum einen Platz finden wirst wo du dieses Riesen-Array in einem Stück ablegen kannst.
Wenn du nur 0 und 1 setzen können musst, warum arbeitest du dann nicht auf Bit-Ebene? Dann würde ein Integer-Array mit 32^3 Werten reichen, da du ja in jedem Integer 32-Werte speichern kannst..!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 31.01.05 00:28
TFileStream und dort dann immer 1MH-große Teilbereiche in den Speicher kopieren, je nachdem welches grad gebraucht wird ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
FabianS
Hält's aus hier
Beiträge: 8
Microsoft Windows 98SE
Delphi 6 Personal
|
Verfasst: Mo 31.01.05 00:45
mh..
@motzi
wie kann ich denn nur EIN bit reservieren? oder geht das gar net?
@BenBE
TFileStream sagt mir nix. könntest du ein beispiel machen, wie man FileStream nutzen könnte?
danke schonmal für die hilfe soweit..
na toll...
selbst wenn ich
Delphi-Quelltext 1:
| array of array of array of 0..1 |
nutze, komme ich noch auf rund 120 MB RAM. hab aber nur 64MB ^^
mfg fabian
Moderiert von Motzi: Postings zusammengefügt.
|
|
Motzi
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mo 31.01.05 01:04
FabianS hat folgendes geschrieben: | @motzi
wie kann ich denn nur EIN bit reservieren? oder geht das gar net? |
Einzelne Bits kannst du nicht reservieren, da die kleinste adressierbare Einheit 1 Byte ist, aber du kannst die einzelnen Bits der Integers setzen und lesen..!
PS: bitte nicht 2 mal in hintereinander in kurzem Abstand posten sondern die Edit-Funktion benutzen!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
UC-Chewie
Beiträge: 531
WinXP
D5 Ent
|
Verfasst: Mo 31.01.05 11:33
Außerdem ist es unwahrscheinlich (denke ich, weiß ja nicht, was du modellieren willst), dass jedes Feld deiner Matrix belegt sein wird. Ich würde mir Gedanken machen, wie ich meine Daten anders darstellen kann (z.b. irgendeine Art verkettetes Gitter mit Entfernungsangabe oder so).
_________________ Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
|
|
Lossy eX
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mo 31.01.05 12:20
Das denke ich allerdings mal. Evtl wäre es gar nicht mal schlecht, wenn du uns genau erklären würdest was du damit vor hast? Vielleicht gibt es ja eine recht einfach Lösung für dein Problem. Ich denke nämlich mal nicht, dass du vor hast den gesammten Speicher zu belegen. Sondern eher nur ein Struktur zu haben in der du etwas ablegen und schnell drauf zugreifen kann, oder? Ist aber nur ne Vermutung.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 31.01.05 13:59
Für TFileStream siehe bitte in den Tuts.
Grundlegend:
Um auf das Element A[X,Y,Z] zuzugreifen, muss man auf die Adresse
FS.Position := SizeOf(Grundtyp) * (Z + NumberOfElementsZ * (Y + NumberOfElementsY * X)); zugreifen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
tommie-lie
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Mo 31.01.05 15:27
FabianS hat folgendes geschrieben: | nutze, komme ich noch auf rund 120 MB RAM. hab aber nur 64MB ^^ |
Das eine hat seit rund 15 Jahren mit dem anderen nichts mehr zu tun, dein Adressbereich umfasst 4GB, von dem dir unter Windows 2GB zur Verfügung stehen, egal wieviel RAM du hast. Das, was in den physischen Speicher nicht reinpasst, wird ausgelagert und landet in der pagefile.swp (unter Win98 hieß sie anders, ich meine irgendwas mit 386 im Namen, kann mich aber nicht mehr erinnern).
Wenn du Manuels Methode nachgehst, brauchst du "nur" 125MB Speicher, bei ausreichend groß konfiguriertem Pagefile klappt das wunderbar (wenn auch entsprechend langsam, weil die Festplatte nicht so schnell ist wie der RAM). Bens Methode ist faktisch Paging, nur daß du dich selbst drum kümmern musst. 4GB kriegst du unter Win98SE aber damit auch nicht hin, denn eine Datei, die 2GB groß ist, wirst du mit FAT und FAT32 vergeblich versuchen, anzulegen
Zu Manuels Methode:
Die Umsetzung kannst du mit der logischen Operation and machen. Die nimmt als Operanden zwei Masken (in Form von ordinalen Werten) an und gibt dir eine AND-Verknüpfung zurück. Wenn du nun gegen ein Muster prüfst, bei dem nur ein einziges Bit gesetzt ist, kannst du anschließend Prüfen, ob die zurückgegebene Verknüpfung 0 ist, oder nicht. In ersterem Fall ist das Bit nicht gesetzt, in letzterem Fall schon.
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
Motzi
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mo 31.01.05 19:35
tommie-lie hat folgendes geschrieben: | Wenn du Manuels Methode nachgehst, brauchst du "nur" 125MB Speicher |
Falsch... 32^3 * 4 = 131072 = 128kb - ist also sehr human vom Speicherverbrauch her!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
tommie-lie
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Mo 31.01.05 19:45
Motzi hat folgendes geschrieben: | tommie-lie hat folgendes geschrieben: | Wenn du Manuels Methode nachgehst, brauchst du "nur" 125MB Speicher | Falsch... 32^3 * 4 = 131072 = 128kb - ist also sehr human vom Speicherverbrauch her! |
Er will 1024^3 Elemente speichern, sind also 1 Milliarde (1073741824) Werte, die alle in einem einzigen Bit dargestellt werden können. Also haben wir 1Mrd / 8 Byte = 134217728, und das sind 128 Megabyte (call it MibiByte, wenn du willst ).
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 31.01.05 20:24
tommie-lie hat folgendes geschrieben: | Bens Methode ist faktisch Paging, nur daß du dich selbst drum kümmern musst. 4GB kriegst du unter Win98SE aber damit auch nicht hin, denn eine Datei, die 2GB groß ist, wirst du mit FAT und FAT32 vergeblich versuchen, anzulegen |
Jip. wenn man's richtig proggt, ist die Speichergröße aber praktisch nur noch vom Festplattenplatz abhängig. Dazu muss man dieses Paging aber entsprechend in mehrere Files aufteilen, wass man sowieso machen sollte. Außerdem bietet sich in dem Zusammenhang die Verwendung von MMFs an, da dann das lästige Seeken in der Datei von Windows erledigt wird.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
tommie-lie
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Mo 31.01.05 20:55
BenBE hat folgendes geschrieben: | Jip. wenn man's richtig proggt, ist die Speichergröße aber praktisch nur noch vom Festplattenplatz abhängig. |
Ist es beim Windows-Paging auch. Nur frage ich mich gerade, was Windows macht, wenn die Paging-Datei größer als 2GB wird... logisch wäre es, eine zweite Datei zu erzeugen, aber ob Microsoft das auch als logisch empfunden hat?
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
Motzi
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mo 31.01.05 21:14
tommie-lie hat folgendes geschrieben: | Nur frage ich mich gerade, was Windows macht, wenn die Paging-Datei größer als 2GB wird... |
Ähm.. wie willst du denn eine 2GB große MMF erzeugen..? Die MMF wird ja schließlich in den Adressraum gemappt und da hast du bekanntlich nur Zugriff auf 2GB...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
|