AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Memory leak durch funktion readln

Ein Thema von danieldelphi · begonnen am 12. Mär 2015 · letzter Beitrag vom 13. Mär 2015
Antwort Antwort
Seite 2 von 3     12 3   
danieldelphi

Registriert seit: 12. Mär 2015
38 Beiträge
 
#1

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:36
Delphi-Quellcode:
procedure sterb_schleife;
var
  quell_dat, grossdatei: text; // ??????? C++

    flush(quell_dat); // ??????

end;
hmm Welche Delphi Version soll das den sein?
Flush auf die Quelle?

Also ich denke nicht das ein ReadLn/Writeln ein MemoryLeak produziert.

Bist Du sicher, dass Du uns "genug" Sourcecode gepostet hast?

Mavarik
das ist delphi 6. ich bin eig sicher dass ich euch genug gepostet habe, ich kann aber gern noch mehr raus hauen, also hier das problem im großen
Delphi-Quellcode:
{$O-}
unit sterb;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, deklara, plausi, struktur, Zaehler;

procedure sterb_schleife;


implementation

procedure sterb_schleife;
var
  autodatei, quell_dat, plausidatei, mrdatei, toddatei, hilfdatei, grossdatei: text;
  kette, plausikette: string;
  fehler, i, j, zaehler, plausibele, unplausibel, position: integer;

begin
  meldung.add('Gesellschaftskennzeichen: ' + gesell);
  {autodatei = Steuerdatei für ausgewählte Gesellschaft,
    enthält Liste der gelieferten Dateien}

  assign(autodatei, pfad_ein + gesell + 'inp.txt');
  reset(autodatei);
  //##########################
  //VU Ordner selbst anlegen
  //#############################
  if not DirectoryExists(pfad_aus+gesell) then
   ForceDirectories(pfad_aus+gesell);
  //##########################
  //alle dateipfade geändert, +gesell+'\' + hinzugefügt
  //#############################

  {mrdatei = Datei für Münchener Rück. Wird aber scheinbar nicht mehr gebraucht}
  assign(mrdatei, pfad_aus +gesell+'\' + gesell + 'mr.txt');
  rewrite(mrdatei);
  {toddatei: Wenn satz.zustand[1] = 'T' dann Datensatz rausschreiben.}
  assign(toddatei, pfad_aus +gesell+'\' + gesell + 'tod.txt');
  rewrite(toddatei);
  {grossdatei: Immer Datensatz rausschreiben.}
  assign(grossdatei, pfad_aus +gesell+'\' + gesell + 'big.txt');
  rewrite(grossdatei);

  assign(hilfdatei, pfad_aus +gesell+'\' +gesell + 'hilf.txt');
  rewrite(hilfdatei);

  meldung.add('Initialisieren der Variablen');
  zaehler_gesamt := 0; zaehler_nicht_verarbeitet := 0;
  for i := 1 to mwcount do
    for j := 1 to nwcount do wcount[i, j] := 0;

  struktur_insp(false); //Strukturtabellen initialisieren

  meldung.add(' Lesen der Versicherungsdaten.');
  readln(autodatei, kette);


  while kette <> 'endedo
  begin
    quell_dat_name := kette;
    {quelldat= ausgewählte gelieferte Datei der ausgewählten Gesellschaft}
    meldung.add('***' + kette + '***');
    assign(quell_dat, pfad_ein + gesell + '\' + quell_dat_name);
    reset(quell_dat);

    position := length(kette);
    plausikette := kette;
    plausikette[position - 3] := kette[position - 2];
    plausikette[position - 2] := kette[position - 1];
    plausikette[position - 1] := kette[position];
    plausikette[position] := '.';
    assign(plausidatei, pfad_aus + gesell + '\plausi_' + plausikette + 'txt');
    rewrite(plausidatei);

    //Für Datei spezifiziertes Meldejahr in datmelde_jahr einlesen:
    readln(autodatei, kette);
    val(kette, datmelde_jahr, fehler);

    //Entscheiden, ob neues oder altes Datenformat verwendet wird
    // alt = Datenformat bis 2004 ohne neue Felder
    // uebergang = Datenformat bis 2004, neue Felder am Ende angehängt
    // neu = Ab 2005 vorgeschlagener einheitlicher Datensatz für alle Pools
    readln(autodatei, kette);
    if kette = 'neuthen datenformat := 2
    else if kette = 'uebergangthen datenformat := 1
    else if kette = 'altthen datenformat := 0
    else messagedlg('Keine gültige Spezifikation des Datenformats in der Steuerdatei!', mtinformation, [mbOk], 0);


    zaehler := 0;
    plausibele := 0;
    unplausibel := 0;


    //in Daten von Quelle-Versicherung erste Zeile =Überschrift überlesen
    if gesell = 'QUthen readln(quell_dat, zeile);

    {Datensätze in quell_dat einlesen und auswerten}
    while not eof(quell_dat) do
    begin

      umfehler := false;
      sterb_fehler := false;
      istrente := true;
      /////////////////////////

       readln(quell_dat, zeile);
      if ioresult <> 0 then begin
        messagedlg('Fehler beim Lesen der Datei!', mtError, [mbOk], 0);
        break;
      end;

      //BG2010: Wenn Zeile mit Hochkomma beginnt, dann Einlesevorgang abbrechen...
      if zeile[0] = '''then break;
       inc(zaehler);
      va2i := 1;

      if gesell = 'QUthen umwandel_quelle(datenformat)
        {else if gesell = 'MA' then umwandel_mannheimer}
        //else if gesell = 'MR' then umwandel_mr
      ////////////////////////////
      else umwandel(datenformat);
      ////////////////////////////
      //if satz.gesellschaft = 'EU' then writeln(mrdatei, zeile);
      if umfehler then begin
        writeln(plausidatei, zaehler, ';100;Umwandelfehler');
        inc(unplausibel);
      end;
      if (not umfehler) and istrente then begin
        if satz.vers_art[2] = 'Lthen va2i := 2;
        plausibel(plausidatei, zaehler);
        if sterb_fehler then inc(unplausibel);
        if not sterb_fehler then begin
          inc(plausibele);
          codieren(zaehler); //Werte in Strukturtabellenindizes übersetzen
          struktur_zaehlen(zaehler); //Strukturtabellen belegen
          //val(copy(satz.geb_datum, 1, 4), gebjahr, fehler);
          {if (code.geschlecht = 2) and ((gebjahr = 1936) or (gebjahr = 1937)) then}
          ////////////////////////////////
          sterb_zaehlen(hilfdatei, zaehler, steuerung_ausgabe); //Sterblichkeits-Zaehlertabelle belegen
          ////////////////////////////////
          schreibe_grossdatei(grossdatei);
          ////////////////////////////////
        end;
        if abbruch then exit;
        if umfehler or sterb_fehler then inc(zaehler_nicht_verarbeitet);
        inc(zaehler_gesamt); str(zaehler_gesamt, kette);
        if ((zaehler_gesamt mod 1000) = 0) then dsnr.strings[1] := kette;
      end;

    end;

    flush(quell_dat);
    close(quell_dat);
    writeln(plausidatei, zaehler, ';Datensätze');
    writeln(plausidatei, unplausibel, '; unplausible Datensätze');
    writeln(plausidatei, plausibele, '; plausible Datensätze');
    flush(plausidatei);
    close(plausidatei);

    //close(mrdatei);
    readln(autodatei, kette);
  end; {*kette='ende' in autodatei*}

  meldung.add('Speichern der Struktur-Tabellen');
  struktur_insp(true); //Strukturtabellen speichern
  flush(mrdatei);
  close(mrdatei);
  flush(toddatei);
  close(toddatei);
  flush(grossdatei);
  close(grossdatei);
  flush(hilfdatei);
  close(hilfdatei);
  meldung.add(' ');
  str(zaehler_gesamt, kette);
   meldung.add('Datensätze gesamt: ' + kette);
  str(zaehler_nicht_verarbeitet, kette);
  meldung.add(' davon nicht verarbeitet: ' + kette);
  str(plausibele, kette);
  meldung.add('Datensätze plausibel: ' + kette);
  meldung.add(' ');

  zaehler_ausgabe(wcount);

end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:38
Wann wird die Stringliste meldung geleert?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
danieldelphi

Registriert seit: 12. Mär 2015
38 Beiträge
 
#3

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:40
Wann wird die Stringliste meldung geleert?
die wird gar nicht geleert, bzw beim beenden des programms, aber da kommen nur ein paar zeilen rein, die auf dem form angezeigt werden
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:44
Speichermäßig ist das doch am einfachsten mit zeilenweiser String-Bearbeitung, oder?

Delphi-Quellcode:
procedure Die_Schleife_Stirbt_Nicht(Von,Nach: string);
var
  T1, T2: TextFile;
  Zeile: string;
begin
  AssignFile(T1,Von); // bzw. Assign(T1,Von); in D6
  Reset(t1);
  AssignFile(T2,Nach);
  Rewrite(T2);
  while not EOF(T1) do begin
    ReadLn(T1,Zeile);
    // Zeileninhalt bearbeiten
    WriteLn(T2,Zeile);
  end;
  CloseFile(T1); // bzw. Close(T1) in D6
  CloseFile(T2);
end;
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
danieldelphi

Registriert seit: 12. Mär 2015
38 Beiträge
 
#5

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:47
Speichermäßig ist das doch am einfachsten mit zeilenweiser String-Bearbeitung, oder?

Delphi-Quellcode:
procedure Die_Schleife_Stirbt_Nicht(Von,Nach: string);
var
  T1, T2: TextFile;
  Zeile: string;
begin
  AssignFile(T1,Von); // bzw. Assign(T1,Von); in D6
  Reset(t1);
  AssignFile(T2,Nach);
  Rewrite(T2);
  while not EOF(T1) do begin
    ReadLn(T1,Zeile);
    // Zeileninhalt bearbeiten
    WriteLn(T2,Zeile);
  end;
  CloseFile(T1); // bzw. Close(T1) in D6
  CloseFile(T2);
end;
gebnau das ist ja der ausgangspunkt, so ist am ende der arbeitsspeicher mit der einzulesesnden datei gefüllt.
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:53
gebnau das ist ja der ausgangspunkt, so ist am ende der arbeitsspeicher mit der einzulesesnden datei gefüllt.
Aber genauso mach ich das schon jahrelang mit großen Textdateien ohne Probleme. Schau dir deinen Code genauer an, da musst du ein Problem haben.

Was soll z.B. das...wenn angenommen "Zeile" eine Stringvariable ist:

Delphi-Quellcode:
//BG2010: Wenn Zeile mit Hochkomma beginnt, dann Einlesevorgang abbrechen...
      if zeile[0] = '''then break;
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:47
das ist delphi 6.
hmm cool

Unter Delphi 6 ist ein String immer ein Shortstring... Oder verwechsele ich da gerade etwas? Ist zu lange her...

Bist Du sicher, das Deine Zeilen in den Textdateien kürzer als 255 Zeichen sind?

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#8

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:49
Du bist anscheinend bei Delphi 1 stehengeblieben, in Delphi 2 bis 2007 ist ein String ein AnsiString.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:50
du bist anscheinend bei delphi 1 stehengeblieben, in delphi 2 bis 2007 ist ein string ein ansistring.
ok ok...
  Mit Zitat antworten Zitat
danieldelphi

Registriert seit: 12. Mär 2015
38 Beiträge
 
#10

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:49
das ist delphi 6.
hmm cool

Unter Delphi 6 ist ein String immer ein Shortstring... Oder verwechsele ich da gerade etwas? Ist zu lange her...

Bist Du sicher, das Deine Zeilen in den Textdateien kürzer als 255 Zeichen sind?

Mavarik
ich bin mir nicht sicher, bzw ich weiß, dass die zeieln teilweise über 300 zeichen haben, aber zeile ist bei mir auch ein char array mit 500 zeichen den ich dann in der procedure in einen string umwandel, siehst du da ein problem dass ich nicht sehe?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3   

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 06:38 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