Einzelnen Beitrag anzeigen

PeSch

Registriert seit: 9. Jan 2012
6 Beiträge
 
#1

Problem mit großer Textdatei

  Alt 9. Jan 2012, 15:58
Hallo Leute,

Bin neu im Forum und weiss nicht ob ich hier in der richtigen Kategorie bin.

Vorab: Suchfunktion habe ich schon benutzt, was ich gefunden habe reicht mir nicht .

Folgendes Problem: ich habe eine sehr große Text-Datei (.txt) (rund 260MB), die ich durchsuchen will. Im wesentlichen enthält die abermillionen von Zeilen mit Messdaten und zwischendrin immer mal einige Strings wie bspw. "Frame". Nach jenen möchte ich suchen und mir die Zeile ausgeben lassen in der Sie sich befinden. Wie lange die Suche dauert bzw. wie effizient sie ist, spielt für mich keine Rolle. Obs nun 5min oder 20min dauert, völlig egal, hauptsache ich muss nichts per Hand machen .

Der Code:

Code:
var
Dateipfad: String;
FrameNumber,i,j: Integer;
Datensatz :TStringList;
Positionen: Array of Integer;
Abstaende: Array of Integer;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
    FrameNumber:=StrToInt(Edit2.text);
    Dateipfad:=Edit1.text;
    Datensatz:=TStringList.create;
    Datensatz.LoadFromFile(Dateipfad);
    SetLength(Positionen,FrameNumber+1);

    For i:=1 To Datensatz.Count-1 Do
        Begin
           If Pos('Frame',Datensatz.Strings[i])>0 Then
           Begin
           Positionen[i]:=i;
           ListBox1.Items.Add(IntToStr(Positionen[i]));
           End;
        end;


    Datensatz.free;
end;

end.
Was ich in eurer Hilfe und im Forum schon gelesen habe, ist dass TStringList nicht grad die effizienteste und eleganteste Lösung ist, aber die am einfachsten verständliche und das reicht mir vollkommen. Nun zum Problem: Der Code funktioniert bei kleineren Dateien einwandtfrei, bspw bei 15MB. Bei den großen kommt immer eine Fehlermeldung nach gewisser Zeit, warum weiss ich nicht. Wenn die Fehlermeldung kommt wird das Programm im Arbeitsspeicher RIESIG...das nimmt erst alle paar Sekunden um ca 50MB zu, bis die Größe der Text-Datei erreicht ist + Eigengröße. Dann tut sich eine Zeit lang nichts und dann explodiert die Größe im RAM auf etwas über 1GB und dann kommt der error: "Access violation". Ich nutze Lazarus, hoffe das ist im Delphi-Forum kein Problem.


Wäre wirklich froh, wenn mir jemand helfen könnte.

MfG

Peter


P.S.: Das Problem hängt nicht vom OS ab, tritt bei Win7 und WinXP auf.
  Mit Zitat antworten Zitat