AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein SetLength / Getmem / AllocMem out of memory Problem
Thema durchsuchen
Ansicht
Themen-Optionen

SetLength / Getmem / AllocMem out of memory Problem

Ein Thema von greenmile · begonnen am 7. Okt 2009 · letzter Beitrag vom 9. Okt 2009
Antwort Antwort
Seite 2 von 3     12 3      
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#11

Re: SetLength / Getmem / AllocMem out of memory Problem

  Alt 8. Okt 2009, 09:51
"z.B. verkettete Liste statt Array"

Was meinst Du genau damit?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#12

Re: SetLength / Getmem / AllocMem out of memory Problem

  Alt 8. Okt 2009, 10:30
Hallo,

kennst du keine verketteten Listen ? tztz

Jedes Listen-Element ist ein Record oder eine Klasse,
wobei jedes Element seinen Nachfolger kennt.
Das letzte Element hat NIL als Nachfolger.
Kennt ein Elment auch seinen Vorgänger,
sprucht man von doppelt verketteten Listen.

Hier wird dann der Speicher immer häppchenweise
und nicht am Stück angefordert.




Heiko
Heiko
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#13

Re: SetLength / Getmem / AllocMem out of memory Problem

  Alt 8. Okt 2009, 10:33
Hört sich gut an, hast Du ein Beispiel für mich?

Zitat von hoika:
Hallo,

kennst du keine verketteten Listen ? tztz

Jedes Listen-Element ist ein Record oder eine Klasse,
wobei jedes Element seinen Nachfolger kennt.
Das letzte Element hat NIL als Nachfolger.
Kennt ein Elment auch seinen Vorgänger,
sprucht man von doppelt verketteten Listen.

Hier wird dann der Speicher immer häppchenweise
und nicht am Stück angefordert.




Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: SetLength / Getmem / AllocMem out of memory Problem

  Alt 8. Okt 2009, 10:36
Bei Google suchenverkettete Liste

das ganze nochmal kurz als Array ... zum Vergleich
Delphi-Quellcode:
TData = record
  name: String;
  typ: Integer;
  ...
end;

TAsArray = Array of TData;
eine einfach verkettete Liste
Delphi-Quellcode:
PListe = ^TListe;
TListe = record
  next: PListe;

  name: String;
  typ: Integer;
end;

var myList: PListe;
bei dieser verketten Liste ist es so, daß nur der Zeiger auf das erste Element in der Liste bekannt ist
und jede Element kennt dann seinen Nachfolger ... du kannst dich also vom ersten element aus zu allen anderen Elementen durchhangeln


und das wäre dann eine doppelt verkettete Liste
Delphi-Quellcode:
PListe = ^TListe;
TListe = record
  prev: PListe;
  next: PListe;

  name: String;
  typ: Integer;
end;

var myList_first: PListe;
    myList_last: PListe;
hier kennt dann jedes Element auch noch seinen Vorgänger ... das macht es dann einfacher diese Liste zu "editieren" (zu verändern, wie z.B. Einträge einzufügen oder zu entfernen)


Der Vorteil gegenüber dem Array ist dann einfach, daß diese Daten nicht stur alle in einer Reihe angeordnet sein müssen ... sie können sich also frei im verfügbaren Speicher verteilen und brauchen keinen gemeinsamen Speicherblock.


Was jetzt aber für dich eine "gute" Lösung wäre, das kommt darauf an, wie der Zugriff auf deine Daten aussieht, wie/ob diese auch mal verändert werden und vorallem welche und wieviele Daten du in jedem Element drinnen hast.

z.B. bei einem Array of String wäre es Schwachsinn dieses als verkettete Liste verwalten zu wollen, da so der Speicherverbrauch und auch der Verwaltungsaufwand wesentlich höher wäre, als beim Array.
$2B or not $2B
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#15

Re: SetLength / Getmem / AllocMem out of memory Problem

  Alt 8. Okt 2009, 11:33
Danke für die Beispiele. Aber bei 800 MByte sorgt das ja ordentlich für Overhead.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: SetLength / Getmem / AllocMem out of memory Problem

  Alt 8. Okt 2009, 11:37
Drum sagte ich ja, es gibt mehrere Möglichkeiten, welche man dann entsprechend abwegen kann.

eine Möglichkeit wäre z.B. auch das Array einfach aufzuteilen

Delphi-Quellcode:
// statt
TMyArray = Array of Data;

// dieses
TMyArray = Array of Array of Data;
Das SetLength ist dann zwar ein bissl umständlich zu erledigen, aber zugreifen könnte man dann z.B. so
(wenn man davon ausgeht, daß nach jeweils 1000 Einträgen ein neues SubArray erstellt wurde)
Delphi-Quellcode:
MyArr[i]

MyArr[i div 1000, i mod 1000]
[add]
Length würde dann etwa so aussehn
Delphi-Quellcode:
// für's normale Array
Length(MyArr)

// eine kleine Funktion für das gesplittete Array
function MyLength(var MyArr: ...): Integer;
begin
  Result := High(MyArr) * 1000 + Length(MyArr[High(MyArr)]);
end;
$2B or not $2B
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#17

Re: SetLength / Getmem / AllocMem out of memory Problem

  Alt 8. Okt 2009, 11:55
Es geht um ein Array of Byte. Die externe Funktion ruft ein OnRead / OnWrite Callback auf. Im "OnRead" wird übergeben, ab welcher Position wieviel Bytes gelesen und in einen Buffer geschrieben werden. Bei "OnWrite" wird übergeben, wieviel Bytes an welcher Position in den lokalen Puffer geschrieben werden.

Übergeben wird dann zum Beispiel 4096 Bytes an Position X (z.B. 600 MByte). Momentan erledige ich das mit einem Array of Byte, weil da Position 4096 ja bekannt ist (mittels Move(MyArrayOfByte[ReadOffset],ReadBuffer,ReadSize)). Wenn ich das alles aber aufsplitte, dann ist u.U. genau bei 4000 schluß und ich muss die restlichen 96 Bytes woanders lesen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: SetLength / Getmem / AllocMem out of memory Problem

  Alt 8. Okt 2009, 12:06
Die über 800 MB dann so im RAM behalten zu wollen ist dann aber wohl eher ein Designfehler in der Anwendung.

Hier würde sich dann eine MMF anbieten ... diese in der entsprechenden Größe erstellt

dann einfach nur den Bereich z.B. 4096 Bytes ab Position sound so in den Speicher mappen, die Daten da reinkopieren und dann den Bereich eventuell gleich wieder freigeben.


für alle möglichen anderen Fälle ginge z.B. sowas (also ab Delphi 2006)
dieses stellt quasi ein einfaches dynamisches Array mit gesplittetem Datenbereich dar
Delphi-Quellcode:
Type TSplittArray<Typ> = Record
  Private
    Var _SplittSize: Integer;
      _Data: Array of Array of Typ;
    Function Getter(Index: Integer): Typ; Inline;
    Procedure Setter(Index: Integer; Const Value: Typ); Inline;
  Public
    Procedure SetSplittSize(i: Integer);
    Procedure SetLength (i: Integer);
    Function Length: Integer; Inline;
    Function High: Integer; Inline;
    Property Value[Index: Integer]: Typ Read Getter Write Setter; Default;

    //Procedure Push(Const Value: Typ);
    //Function Pop: Typ;
  End;

Function TSplittArray<Typ>.Getter(Index: Integer): Typ;
  Begin
    Result := _Data[Index div _SplittSize, Index mod _SplittSize];
  End;

Procedure TSplittArray<Typ>.Setter(Index: Integer; Const Value: Typ);
  Begin
    _Data[Index div _SplittSize, Index mod _SplittSize] := Value;
  End;

Procedure TSplittArray<Typ>.SetSplittSize(i: Integer);
  Begin
    If Assigned(_Data) Then System.Error(reInvalidOp);
    _SplittSize := i;
  End;

Procedure TSplittArray<Typ>.SetLength(i: Integer);
  Var i2: Integer;

  Begin
    i2 := System.High(_Data);
    System.SetLength(_Data, (i - 1) div _SplittSize + 1);
    For i2 := i2 to System.High(_Data) - 1 do
      System.SetLength(_Data[i2], _SplittSize);
    If i > 0 Then
      System.SetLength(_Data[System.High(_Data)], i mod _SplittSize);
  End;

Function TSplittArray<Typ>.Length: Integer;
  Var i: Integer;

  Begin
    i := System.High(_Data);
    Result := i * 1000 + System.Length(_Data[i]);
  End;

Function TSplittArray<Typ>.High: Integer;
  Begin
    Result := Length - 1;
  End;

{Procedure TSplittArray<Typ>.Push(Const Value: Typ);
  Var i: Integer;

  Begin
    i := Length;
    SetLength(i + 1);
    Setter(i - 1, Value);
  End;

Function TSplittArray<Typ>.Pop: Typ;
  Var i: Integer;

  Begin
    i := High;
    Result := Getter(i);
    SetLength(i);
  End;}
$2B or not $2B
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#19

Re: SetLength / Getmem / AllocMem out of memory Problem

  Alt 8. Okt 2009, 12:59
Hallo,

was ist dass denn für eine Datei,
wo du alle 800 MB im Speicher haben musst ?


Heiko
Heiko
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#20

Re: SetLength / Getmem / AllocMem out of memory Problem

  Alt 8. Okt 2009, 13:12
Ein RamDrive
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 10:19 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