Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi zu wenig arbeitsspeicher? (https://www.delphipraxis.net/170697-zu-wenig-arbeitsspeicher.html)

Lyan 28. Sep 2012 22:09

Delphi-Version: 7

zu wenig arbeitsspeicher?
 
Hallo,

habe 8 GB RAM und habe einen ultra!! langen String in dem Source, den ich mir in einer Funktion zurückgeben möchte.

Ich verstehe nicht, warum ich zu wenig Arbeitsspeicher habe? Ichkann en String auch nicht manuell kopieren?

Das kann ja nicht sein? o.O

Stringlänge ~5mio. zeichen

Funktion sieht ungefähr so aus:


Delphi-Quellcode:
function rueckgabe : String;
begin
  result := langerstringzweihundertfünfundfünfzigzeichenprozeile + langerstringzweihundertfünfundfünfzigzeichenprozeile + 
langerstringzweihundertfünfundfünfzigzeichenprozeile;
end;

Sir Rufo 29. Sep 2012 01:21

AW: zu wenig arbeitsspeicher?
 
Der Compiler ist halt der Meinung, wer so einen langen String nicht aus einer Ressource oder externen Datei lädt, der hat vom falschen Baum geraucht. :cyclops: Und womit?

Meiner Meinung nach mit Recht.

Alleine die Vorstellung diese ca. 20000 Zeilen alle entsprechend zu quoten und zu verbinden (von der evtl. Änderung mal ganz abgesehen), lässt es mir kalt den Rücken runterlaufen.

Alles zum Thema Ressourcen (auch in Bezug zu diesem Problem) findest du über die SuFu hier im Forum.

Perlsau 29. Sep 2012 05:51

AW: zu wenig arbeitsspeicher?
 
Zitat:

Zitat von Lyan (Beitrag 1184914)
Delphi-Quellcode:
function rueckgabe : String;
begin
  result := langerstringzweihundertfünfundfünfzigzeichenprozeile + langerstringzweihundertfünfundfünfzigzeichenprozeile + 
langerstringzweihundertfünfundfünfzigzeichenprozeile;
end;

Arbeite doch mit einer StringList, wenn dein String sowieso bereits in Zeilen unterteilt ist.

himitsu 29. Sep 2012 06:26

AW: zu wenig arbeitsspeicher?
 
Und nein, denn dein Programm hat nur 2 GB zur Verfügung.
Du kannst auch nur 1 GB physikalischen RAM besitzen und 2 GB als Pagefile ... der virtuelle Speicher in deinem Programm bleibt dennoch nur bei maximal 2 GB (für 32 Bit-Programme).

Und in diesen 2 GB muß auch irgendwo ein Stück freies gefunden werden, welches zusamenhängend genügend Speicher bietet.

Die TStringList hat da den Vorteil, daß sie alle "Zeilen" einzeln im RAM verteilt.

p80286 29. Sep 2012 17:59

AW: zu wenig arbeitsspeicher?
 
Ich habe irgendwie das Gefühl, daß Du einen String als Container für etwas ganz anderes mißbrauchst.

Wie wäre es wenn Du eine etwas weniger kryptische Beschreibung erstellen würdest?
Oder vielleicht uns einmal ein paar der sehr langen Strings zeigen würdest?

Gruß
K-H

Lyan 29. Sep 2012 18:24

AW: zu wenig arbeitsspeicher?
 
Zitat:

Zitat von p80286 (Beitrag 1184984)
Ich habe irgendwie das Gefühl, daß Du einen String als Container für etwas ganz anderes mißbrauchst.

Wie wäre es wenn Du eine etwas weniger kryptische Beschreibung erstellen würdest?
Oder vielleicht uns einmal ein paar der sehr langen Strings zeigen würdest?

Gruß
K-H

Klar, hab dir zu liebe dir sogar den kompletten String auf meinem Server hochgeladen:

http://aciid.org/img/langerstring.txt

;)

Resource mag ich nicht, wird als virus anerkannt. das hatte ich nämlich vorher :)

Abseits vom Thema:
Delphi ist sowieso strange, wieso wird ein leeres Delphi-projekt überhaupt als virus erkannt? komisch.

himitsu 29. Sep 2012 18:31

AW: zu wenig arbeitsspeicher?
 
Sicher daß die OutOfMemory-Fehlermeldung zu Laufzeit kommt und nicht etwa doch schon ein "zuviele lokale Konstanten" vom Compiler?

Nja, warum meckert da wohl der Virenscanner? (da ist doch hoffentlich nichts "böses" drin?)

PS: Du hast doch nicht etwa auch versucht den "String" so "kodiert" in die Resourcen gepackt?
Wenn ja, warum steckst du sie denn nicht einfach mal dekodiert dort rein? (das spart sogar Speicher)

jaenicke 29. Sep 2012 18:33

AW: zu wenig arbeitsspeicher?
 
Ressource oder Text, beides wird als Text in der Exe gespeichert. Da musst du dein Programm einfach als False Positive an den Antivirenhersteller melden.

Zitat:

Zitat von Lyan (Beitrag 1184985)
Delphi ist sowieso strange, wieso wird ein leeres Delphi-projekt überhaupt als virus erkannt? komisch.

Das ist z.B. bei Antivir :kotz:, Norton (das ich selbst nutze) und AVG teilweise so. Das liegt aber an den Antivirenherstellern, nicht an Delphi. Die Projekte ähneln sich nun einmal, da der Quelltext der delphieigenen Units in allen enthalten ist.

Lyan 29. Sep 2012 18:40

AW: zu wenig arbeitsspeicher?
 
Zitat:

Zitat von himitsu (Beitrag 1184990)
Sicher daß die OutOfMemory-Fehlermeldung zu Laufzeit kommt und nicht etwa doch schon ein "zuviele lokale Konstanten" vom Compiler?

Nja, warum meckert da wohl der Virenscanner? (da ist doch hoffentlich nichts "böses" drin?)

PS: Du hast doch nicht etwa auch versucht den "String" so "kodiert" in die Resourcen gepackt?
Wenn ja, warum steckst du dann nicht einfach mal dekodiert dort rein? (das spart sogar Speicher)

Also der String ist z.Z. rc4(base64(string)). Als ich noch mit Resource arbeitete, hatte ich base64 weggelassen. Da mein Tool einen Source-Code droppt, hab ich wegen copy-save base64 genommen(agesehen davon, dass nun keine unicodezeichen mehr in dem Source drin sind, die eh nicht als String angesehen werden^^).

himitsu 29. Sep 2012 18:43

AW: zu wenig arbeitsspeicher?
 
Zitat:

Zitat von jaenicke (Beitrag 1184991)
da der Quelltext der delphieigenen Units in allen enthalten ist.

Das hoffe ich mal nicht. Aber ja, die kompilierten Codes der RTL/VCL sind fast immer enthalten.

Nja, zuviele Trojaner wurden mit Delphi erstellt und es gibt zuwenige große Delphiprojekte, weswegen die Heuristiken ein bissl zu allergisch reagieren.

Lyan 29. Sep 2012 18:54

AW: zu wenig arbeitsspeicher?
 
Wird erkannt ->


Delphi-Quellcode:
function GetResources(pSectionName: PChar; out ResourceSize: LongWord): Pointer;
var
  ResourceLocation: HRSRC;
  ResourceHandle: HGLOBAL;
begin
  ResourceLocation := FindResource(hInstance, PAnsiChar(pSectionName), RT_RCDATA);
  ResourceSize := SizeofResource(hInstance, ResourceLocation);
  ResourceHandle := LoadResource(hInstance, ResourceLocation);
  Result := LockResource(ResourceHandle);
end;

function GetResourceAsString(pSectionName: pchar): string;
var
  ResourceData: PChar;
  SResourceSize: LongWord;
begin
  ResourceData := GetResources(pSectionName, SResourceSize);
  SetString(Result, ResourceData, SResourceSize);
end;

Ich habe gehört, es bringt was, die WindowsAPI-Funktionen dynamisch zu callen. Daran bin ich leider auch gescheitert. Vlt. kann mir da einer helfen?

Hab den Source leider nicht mehr, da ichs aufgegeben hatte, aber so in etwa:
(Ich machs nur an einem Beispiel fest)

Delphi-Quellcode:

var xFindResource : function(hModule: HMODULE; lpName, lpType: PChar): HRSRC; stdcall;

procedure loadlibrary;
var
  h32 : THandle;
begin
  h32 := LoadLibraryA('kernel32.dll');
  @xFindResource := GetProcAddress(h32,pchar('FindResource');
end;

Das die Strings "kernel32.dll" sowie als auch "FindResource" nicht plain im Source stehen (weil da die AV-Hersteller auch direkt alarm schlagen), hatte ich damals noch via RC4 diese Strings kodiert.

Was mache ich aber da falsch? So hat es nicht geklappt.

himitsu 29. Sep 2012 19:13

AW: zu wenig arbeitsspeicher?
 
Zitat:

Zitat von Lyan (Beitrag 1185007)
Ich habe gehört, es bringt was, die WindowsAPI-Funktionen dynamisch zu callen.

Da in deinem Programm eh schon Resourcen verwendet werden und sich der Virenscanner eher an der Resource und nicht an der Ladefunktion stört ... was soll das bringen?

Delphi-Referenz durchsuchenTResourceStream

PS: AV-Scanner reagieren eher auf etwas allergisch, wenn man versucht dieses zu verschleiern.

Lyan 29. Sep 2012 19:30

AW: zu wenig arbeitsspeicher?
 
Mein kollege hat in c# nen test gemacht:

16777214 Zeichen PRO Zeile! 2^24-2

Arbeitsspeicher hat er der VM nur 128mb gegeben(unter winxp) und hat einen 32mb string kompiliert!
Wieso hat Delphi so krasse probleme

jaenicke 29. Sep 2012 21:50

AW: zu wenig arbeitsspeicher?
 
Warum sollten die Delphientwickler auch Zeit darauf verschwenden eine Funktion wie diese zu ermöglichen, über die vielleicht 0,001% der Nutzer auch nur nachdenken würden sie zu benutzen und das auch (hoffentlich) nur weniger erfahrene Entwickler?

Da sind sinnvollere Features schlicht wichtiger.

Bummi 29. Sep 2012 23:19

AW: zu wenig arbeitsspeicher?
 
Keine Ahnung wofür man so etwas wie beschrieben bauchen könnte ....
Warum nicht mit einem Zipstream> packen , als Resource einbinden und per >Zipstream wieder einlesen?

Bernhard Geyer 29. Sep 2012 23:42

AW: zu wenig arbeitsspeicher?
 
Zitat:

Zitat von Lyan (Beitrag 1185018)
Wieso hat Delphi so krasse probleme

Evtl. mal mit einer Delphi-Version probieren die nicht schon 10 Jahre auf den Buckel hat.
Wenn schon eine fairer Vergleich dann solltest du VS.NET 2002 mit .NET 1.0 ausprobieren. Ist von dem Release-Datum ebenbürtig.

jaenicke 30. Sep 2012 09:25

AW: zu wenig arbeitsspeicher?
 
Mehr als 1023 Zeichen pro Zeile gehen auch da nicht. Macht aber auch keinen Sinn, insofern ist das auch gut so. Man muss ja nicht Programmiersünden noch unnötig Vorschub leisten...


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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