AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Große String-Liste out of Memory - Hilfe?

Große String-Liste out of Memory - Hilfe?

Ein Thema von Pogoner · begonnen am 20. Apr 2014 · letzter Beitrag vom 23. Apr 2014
Antwort Antwort
Seite 1 von 7  1 23     Letzte » 
Pogoner

Registriert seit: 10. Okt 2013
22 Beiträge
 
Delphi 6 Enterprise
 
#1

Große String-Liste out of Memory - Hilfe?

  Alt 20. Apr 2014, 15:19
Guten Tag
Folgendes Problem: Der Code funktioniert einwandfrei, solange die Stringliste nicht zu groß wird. Das wird sie allerdings unweigerlich, daher meine Frage - wie kann ich das umgehen:

Kann sein, dass hier ein oder 2 'end' komisch sitzen, da ich eine Menge Kommentarcode grade der Übersichtlichkeit wegen gelöscht habe.
Das Programm soll eine Website auf nicht-verlinkte Unter-Seiten absuchen.
Mein Problem ist leider, dass bei 52 Zeichen und über 5 Stellen (ich glaube) der Cluster zu groß wird und ich selbst mit 8GB RAM out of Memory bekomme.
Jetzt will ich die ganzen Möglichkeiten aber eigentlich garnicht speichern, sondern es würde mir ja reichen, sie direkt mit dem Spider abzufragen - wenn ich allerdings npw nicht in Cluster oder Result abspeichere, funktioniert der Code nichtmehr... Wenn mir da jemand helfen könnte, der da mehr versteht als ich, wäre das sehr nett
Ich sitze schon seit Stunden dran und habs mit Freeandnil, Destroy/Create, Savetofile und Writeln versucht, um das zu umgehen, aber ich bekomms nicht hin
Wie kann ich diese ganzen Kombinationen erstellen lassen und direkt abgreifen, ohne dass eine riesige Stringlist entsteht?

Vielen Dank schonmal


Delphi-Quellcode:
function TForm1.bruteforce (astring: string;substr: string; startlen: integer; endlen: integer):LongInt;

var
spider: TSpider;
i,n,x,y, z : integer;
npw, Zeile: string;
Txtdatei: Textfile;

label step1;

begin

Hlplst.Clear;
Cluster.Clear;
Results.Clear;

y:= 0;

spider := TSpider.Create(Self);

urls := 'www.Testwebsite.com/' ;

For x:= 1 to length(substr) do
  begin
    Hlplst.Add(substr[x]);
  end;

step1:

        for i := 0 to hlplst.Count -1 do begin
                for n := 1 to length(astring) do begin

                npw := hlplst.Strings[i]+astring[n];

               Cluster.Add(npw);
              

                if length(npw) >= startlen then
                begin
                Results.Add(npw);
            
        // Hier beginnt nur der Spider
                        urlk := urls + npw ;
                        spider.Initialize(urlk);
                        spider.CrawlNext();

                  
                         Edit1.Text := Spider.LastUrl;
                         Edit2.Text := Spider.LastHtmlTitle;

                                If Edit2.Text = 'Vorhandenthen
                                begin
                                        Memo4.Lines.Add (Edit1.Text);
                                end;
                                                
          // Hier endet er


                end;
        end;
        HlpLst.Clear ;
        hlplst.AddStrings(Cluster);
        Cluster.Clear ;
   

        if length(npw) + 1 <= endlen then goto step1;
        hlplst.Clear;
     end;
        result := 0;
        Label1.Visible := False;
       
         


        end;

  end;
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#2

AW: Große String-Liste out of Memory - Hilfe?

  Alt 20. Apr 2014, 15:42
Also 8MB sollten nicht die Grenze sein. In Grunde sollte das locker bis paar GB gehen. Es kann sein, dass du einfach nicht mehr ausreichen zusammenhängenden Speicher hast.

TStrings besitzt die Eigenschaft Capacity. Normalerweise muss man sich um die nicht kümmern, die wird bei Bedarf automatisch erhöht. Man kann den Wert aber auch manuell setzten wenn man in etwa weiß wie viele Einträge kommen. Bei dir wären das die Menge length(substr) als Wert. Also vorher die Zahl ermitteln, noch 10% als Reserve dazugeben und gleich zu Beginn Capacity mit dem Wert setzten. Entweder kommt dann die Fehlermeldung an der Stelle oder es gibt keine Überraschungen mehr.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.609 Beiträge
 
Delphi 5 Professional
 
#3

AW: Große String-Liste out of Memory - Hilfe?

  Alt 20. Apr 2014, 15:43
Ich empfehle dringend, das Label rauszuschmeißen und stattdessen eine rekursiv arbeitende Funktion aufzubauen! Goto ist böse. Davon abgesehen wird spider nirgendwo ersichtlich freigegeben. Das Problem ist IMO keineswegs eine zu große Stringliste sondern ein falsches Konzept. Mir ist durchaus bewusst, dass Menschen Schwierigkeiten haben, rekursiv zu denken (ebenso wie exponentiell), aber der Aufwand lohnt sich.

Ergänzung: Alternativ, wenn die Rekursion unnötig oder ungeeignet ist, bietet sich vielleicht eine for- oder while-Schleife an, deren Durchlauf man mit Continue überspringen kann.

MfG Dalai

Geändert von Dalai (20. Apr 2014 um 15:46 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: Große String-Liste out of Memory - Hilfe?

  Alt 20. Apr 2014, 15:57
Diese Schleife
Delphi-Quellcode:
  step1:

  //..

  if length(npw) + 1 <= endlen then goto step1;
kann man auch so lösen
Delphi-Quellcode:
  repeat

  //..

  until (length(npw) + 1) > endlen;
Die repeat Schleife wird so lange wiederholt, bis (length(npw) + 1) > endlen ist.

Nebeinbei. U. U. kann das missverstanden werden: if length(npw) + 1 <= endlen . Hier prüft Delphi endlen evtl. nur gegen die 1 .
  Mit Zitat antworten Zitat
Pogoner

Registriert seit: 10. Okt 2013
22 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: Große String-Liste out of Memory - Hilfe?

  Alt 20. Apr 2014, 18:56
Danke erstmal für die Antworten
Also 8MB sollten nicht die Grenze sein. In Grunde sollte das locker bis paar GB gehen. Es kann sein, dass du einfach nicht mehr ausreichen zusammenhängenden Speicher hast.
Da hast du dich verlesen, ich sprach von 8GB.

Danke für den Goto-Ersatz - ich hatte noch mit Goto programmieren gelernt und bin darin verhaftet^^

Aber mein Problem bleibt. Ich muss erneut darauf hinweisen, dass es die Stringlist (Bei unter 5 Stellen ~600MB RAM Bedarf funktioniert alles einwandfrei) ist. Ich errechne mit der Funktion unten bei 5 Stellen und 52 möglichen Zeichen 380204032 Strings - allein die Savetofile Textdatei zu öffnen braucht mindestens 10 Sekunden mit Notepad. Mehr Stellen erhöhen die Potenz. Ich bräuchte eine Möglichkeit, die Kombinationen, die in Results gespeichert werden bzw in Cluster direkt abzugreifen, um das Entstehen einer so großen Stringlist zu verhindern.

Danke erneut

€dit: Das Konzept funktioniert, ich habe den Spider mit Memofeldern getestet und die Results/Cluster-Stringlisten mit Savetofile ausgelesen. Es liegt an der riesigen Menge, die er berechnet. Wenn ich die StringLists per Freeandnil freigebe, ist mein RAM wieder völlig in Ordnung.

Geändert von Pogoner (20. Apr 2014 um 19:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Große String-Liste out of Memory - Hilfe?

  Alt 20. Apr 2014, 19:08
Es wäre auch hilfreich deine Delphi Version zu kennen (kannst du in deinem Profil eintragen) und ob du auch eine 64bit-Anwendung erzeugst, sonst kannst du auf deine 8GB Speicher eh nicht zählen

BTW: Das macht die Verarbeitung künstlich langsamer
Delphi-Quellcode:
                         Edit1.Text := Spider.LastUrl;
                         Edit2.Text := Spider.LastHtmlTitle;
und die Controls sollten auch nicht als Zwischenspeicher misbraucht werden
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (20. Apr 2014 um 19:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.941 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Große String-Liste out of Memory - Hilfe?

  Alt 20. Apr 2014, 19:12
Ich bräuchte eine Möglichkeit, die Kombinationen, die in Results gespeichert werden bzw in Cluster direkt abzugreifen, um das Entstehen einer so großen Stringlist zu verhindern.
In dem Fall wäre es vielleicht hilfreich, wenn du den prinzipiellen Ablauf z.B. in einem Flussdiagramm verdeutlichst. Dann kann man schneller sehen, wo man den Algorithmus abändern kann um den Speicherverbrauch zu reduzieren.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Pogoner

Registriert seit: 10. Okt 2013
22 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: Große String-Liste out of Memory - Hilfe?

  Alt 20. Apr 2014, 19:24
Wow ihr seid ja schnell
Ich benutze Delphi 6.
Mein System ist 32bit.

Allein schon, dass die Cluster-Stringlist bei 5 Stellen knapp 600MB verbraucht, und ich bis 10 Zeichen gehen muss (exponentiell steigend) macht die 8GB irrelevant...

Gefolgt bin ich diesem Tutorial hier, bei dem die Funktion besser erklärt ist, als ich es könnte: http://www.delphipraxis.net/attachme...delphi_131.pdf

Kurz gesagt:
_____a___b___c___d
aa| aaa aab aac aad
ab| aba abb abc abd
ac| aca acb acc acd
ad| ada adb adc add

Linke Spalte ist die Hlplst, die Kombinationen ist die Cluster-Stringlist
Aber ehrlichgesagt hab ich nicht verstanden, wo ich wann meine Cluster-Werte abgreifen kann und die Cluster-Liste wieder reseten kann, ohne dass sie wieder von vorne anfängt...

Die Edit-Felder mach ich raus und frage es direkt ab - guter Hinweis.

Danke nochmals^^

Geändert von Pogoner (20. Apr 2014 um 19:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Große String-Liste out of Memory - Hilfe?

  Alt 20. Apr 2014, 19:44
Zitat von Pogoner:
ich selbst mit 8GB RAM out of Memory bekomme
von denen du rein gar nichts hast bei einer 32bit Anwendung.

Und wenn du den Speicher stark fragmentierst, dann ist sogar schon weit vor der 32bit-Grenze von 2GB Schluss.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Pogoner

Registriert seit: 10. Okt 2013
22 Beiträge
 
Delphi 6 Enterprise
 
#10

AW: Große String-Liste out of Memory - Hilfe?

  Alt 20. Apr 2014, 19:48
Und wenn du den Speicher stark fragmentierst, dann ist sogar schon weit vor der 32bit-Grenze von 2GB Schluss.
Ja aber das ist ja nicht mein primäres Problem - Selbst wenn ich 100GB nutzen könnte, würde mir das in dem Fall nicht helfen, da der Bedarf mit jeder Stelle Faktor 10 wächst. Deshalb will ich die Cluster-Liste ganz vermeiden und die Einträge direkt in den Spider einspeisen... Nur ich weiß eben nicht, wo/wie ich das tun kann...
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf