Hallo leibe Delphianer,
ich muß hier etlich Datensätze vergeleiche bzw. aufbereiten updaten. Die Daten werden im
CSV Format geliefert. Als erstes übertrage ich die Daten mal in eine Interbase Datei. Dieses Daten sollen nun umgewandelt bzw. mit Daten in eiener anderen Interbase
DB verglichen werden. Es handelt sich um ca. 700.000 Datensätze.
Ich bekomme immer nach ca. 70.000 Datensätze eine Fehlermeldung, das zu wenige Arbeitsspeicher vorhanden ist und das auf einem Server mit 8 GB
Ram.
Ich denke mal, das ich ein Fehler in meinen Programm habe welche ich einfach nicht finden kann. Ich habe mal den Code auf das nötigste gekürzt und hoffe, das mir hier jemand helfen kann. Es sein den Speicher nicht mehr freizugeben
Zuerst mal die Komponenten
SucheDaten1,SucheDaten,SucheDaten3,KanalSuchen sind TIBQuery´s
BearbeiteDaten1 ist eine TIBDataset
Ich habe hier schon einiges versucht wie z.B. ein Commit auf die Datenabk nach ca. 10.000 Datensätzen. Nur gebracht hat bis jetzt alles noch nicht.
Delphi-Quellcode:
procedure TPPusKanalEinlesen.DatenEinlesen;
var
I: Integer;
FehlerZaehler: integer;
Kanal: string;
HKanal1,HKanal2,HKanal3: string;
KanalZahl: integer;
Zaehler: integer;
begin
Daten.SucheDaten1.Prepare;
Daten.SucheDaten2.Prepare;
Daten.SucheDaten3.Prepare;
Daten.BearbeiteDaten1.Prepare;
Daten.AnfangsDaten.Active := False;
Daten.AnfangsDaten.Active := True;
Daten.AnfangsDaten.First;
While not Daten.AnfangsDaten.Eof do
begin
Daten.SucheDaten1.ParamByName('Wert1').AsSTring := Daten.AnfangsDaten.FieldByNAme('Wert1').AsString;
Daten.SucheDaten1.Active := True;
Daten.SucheDaten2.ParamByName('Wert2').AsSTring := Daten.AnfangsDaten.FieldByNAme('Wert2').AsString;
Daten.SucheDaten2.Active := True;
if (Daten.SucheDaten1.RecordCount > 0) and (Daten.SucheDaten2.RecordCount > 0 ) then
begin
Daten.BearbeiteDaten1.ParamByName('Test1').AsString := Daten.SucheDaten2.FieldByName('Test1').AsString;
Daten.BearbeiteDaten1.ParamByName('Test2').AsString := Daten.SucheDaten1.FieldByName('Test2').AsString;
Daten.BearbeiteDaten1.Active := True;
if Daten.BearbeiteDaten1.RecordCount > 0 then
begin
//Wurde gefunden
if Daten.BearbeiteDaten1.FieldByName('Kanal').AsString = '' then
begin
//Es ist bis jetzt noch kein Kanal angegeben.
Daten.BearbeiteDaten1.Edit;
//Hier wird noch etwas andres gemaucht habe ich jedoch gelöscht da unwichtig
Daten.BearbeiteDaten1.FieldByName('TestDatum').AsString := DateToStr(AktuellesDatum);
Daten.BearbeiteDaten1.Post;
end
else
begin
if Daten.BearbeiteDaten1.FieldByName('Kanal').AsString <> Kanal then
begin
Daten.BearbeiteDaten1.Edit;
//Hier wird noch etwas andres gemaucht habe ich jedoch gelöscht da unwichtig
Daten.BearbeiteDaten1.FieldByName('TestDatum').AsString := DateToStr(AktuellesDatum);
Daten.BearbeiteDaten1.Post;
end;
end;
end
else
begin
FehlerZaehler := FehlerZaehler +1;
Fehler.Caption := IntToStr(FehlerZaehler);
end;
end
else
begin
FehlerZaehler := FehlerZaehler +1;
Fehler.Caption := IntToStr(FehlerZaehler);
end;
Daten.AnfangsDaten.Next;
end;
Daten.TransEdit.Commit;
end;