AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte [ORP] Diskussion der Import-Klasse
Thema durchsuchen
Ansicht
Themen-Optionen

[ORP] Diskussion der Import-Klasse

Ein Thema von Mithrandir · begonnen am 29. Apr 2009 · letzter Beitrag vom 15. Dez 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Mithrandir
Mithrandir
Registriert seit: 27. Nov 2008
(Prolog: Wie einige von euch sicher wissen, arbeite ich momentan an einem Routenplaner auf Basis der Daten von OpenStreetMap. Um Threads zu kennzeichnen, die sich speziell mit diesem Projekt beschäftigen, nutze ich die Zeichenfolge "[ORP]". ("Orp, orp..." )

Hi ihr,

es ist soweit. Der erste Teilschritt auf dem Weg zum Routenplaner ist geschafft. Dabei handelt es sich um die Klasse, die die XML-Datei verarbeitet, die Daten für die Datenbank aufbereitet und in eine Firebird-Datenbank schreibt.

Da mein letztes Delphi-Programm ja schon etwas her ist (tjaja...), wäre es mir ganz lieb, wenn ihr einen Blick auf meine Klassenimplementation werfen könntet.

Ich bekommen, wenn ich den Import abbreche (einfach das Programm schließen) eine Exception, außerdem steigt der Speicherverbrauch aus welchen Gründen auch immer während des Imports exorbitant an. Vermutlich gibt es irgendwo ein oder mehrere Speicherlecks, die ich einfach übersehe. Ich habe mich schon mit MemCheck abgemüht, aber nicht wirklich Erfolg gehabt. Vielleicht kann einer von euch damit besser umgehen?

Um euch das Testen einfacher zu machen, befindet sich im Anhang eine OSM-Testdatei, die ich ein wenig zusammengestaucht habe. Die Originaldatei ist 25 MB groß, diese nur noch 1,5 MB, beinhaltet aber alles, was man zum Testen brauch'. Außerdem würde die Datenbank eigentlich im Anwendungsdatenverzeichnis des akutellen Nutzers liegen. Für Testzwecke liegt sie jetzt aber im Programmverzeichnis, damit ihr nicht erst durch alle Verzeichnisse springen müsst.

Ebenfalls mit dabei ist der Firebird Embedded in der Version 2.1.

Zum erfolgreichen kompillieren benötigt ihr noch die ZEOSLib, der Download dazu findet sich hier [Sourceforge, 1.6 MB]

Das Projekt hat ebenfalls schon einen "richtigen" Namen bekommen: OpenRoutePlanner. Einen entsprechenden Blog dazu gibt es auch schon.

Ich weiß, dass da noch ein riesiger Berg an Arbeit vor mir liegt, aber mit eurer Hilfe klappt das schon...

Noch ein kleiner Hinweis: Die Eingabemaske prüft nicht, ob der eingegebene Pfad korrekt ist. Außerdem wird der Starten-Button nicht deaktiviert. Ich hoffe, ich habe sonst alles beachtet.
Angehängte Dateien
Dateityp: zip bremen_211.zip (198,6 KB, 76x aufgerufen)
Dateityp: zip saxxmltest_168.zip (2,54 MB, 108x aufgerufen)
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
 
29. Apr 2009, 14:31
Dieses Thema wurde von "mkinzler" von "Object-Pascal / Delphi-Language" nach "Open-Source" verschoben.
Ist ja ein Projekt, dass im Source vorliegt
oki

 
Delphi 2007 Professional
 
#3
  Alt 30. Apr 2009, 06:35
Hi,

ich glaube, deine Schutzverletzung beim Beenden kommt daher:
Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(OSMParser) then
    OSMParser.Destroy;
end;
Ich dächte, dass ist sicherer sollte der Thread noch immer da sein:
Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(OSMParser) then begin
    OSMParser.Terminate;
    OSMParser.WaitFor;
    FreeAndNil(OSMParser);
  end;
end;
Mehr hab ich nich nicht durchgesehen. Compiling ging auch noch nicht. Bei mir werden die Units ZConnection, ZDataSet angemeckert.

Gruß oki
  Mit Zitat antworten Zitat
alzaimar

 
Delphi 2007 Enterprise
 
#4
  Alt 30. Apr 2009, 07:03
Speicherlecks und ähnliche Missgeschicke findet man zuverlässig mit FastMM.
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
 
#5
  Alt 30. Apr 2009, 10:06
Zitat von oki:
Ich dächte, dass ist sicherer sollte der Thread noch immer da sein:
Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(OSMParser) then begin
    OSMParser.Terminate;
    OSMParser.WaitFor;
    FreeAndNil(OSMParser);
  end;
end;
Ok, das habe ich jetzt mal so umgesetzt. Musste gleichzeitig noch ne andere Schleife anpassen. Jetzt meldet mir FastMM immer noch eine Verletzung...

Zitat von oki:
Mehr hab ich nich nicht durchgesehen. Compiling ging auch noch nicht. Bei mir werden die Units ZConnection, ZDataSet angemeckert.
Argh. Mein Fehler. Die beiden angemeckerten Units gehören zur ZEOSLib, download findet sich hier[@Sourceforge, 1.6 MB].

Das Speicherleck konnte ich nicht komplett beheben, der Speicherverbrauch steigt zwar nicht mehr in den riesen Schritten wie vorher, aber er steigt halt immer noch.

Folgende Änderungen habe ich gemacht:

ORP_Extractor.pas, Zeile 538, folgendes hinzugefügt:
FreeAndNil(fRegAttrExpr); ORP_Extractor.pas, Zeile 219, folgendes hinzugefügt:
  FreeAndNil(fRegEx); ORP_Extractor.pas, Zeile 202, folgendes kursiv hinzugefügt
 while (fRegEx.MatchAgain) and (dwLenStr - dwCurPos > 20) [i]and not Terminated[/i] do Ich lade oben gleich mal die neue Version hoch. Was mir beim FastMM-Log aufgefallen ist, ist dass der Trace Stack auch über die Funktionen der ZeosLib rüberläuft. Ich hänge den Log mal hier mit an...
Angehängte Dateien
Dateityp: zip saxxmltest_memorymanager_eventlog_200.zip (60,9 KB, 18x aufgerufen)
米斯蘭迪爾
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#6
  Alt 30. Apr 2009, 10:37
hab jetzt noch nicht seht weit reingesehn, aber schon in der ersten Datei ...

Delphi-Quellcode:
procedure TForm1.UpdateProgressbar(Sender: TObject; Cur: Integer; Max: Int64);
begin
  ProgressBar1.Max := 100;
  ProgressBar1.Position := Round((Cur / Max)*100);
  Form1.Caption := IntToStr(ProgressBar1.Position) + ' % ' + Format('Speed: %3.3f Sec.', [(GetTickCount - Tick)/1000]);
end;

Delphi-Quellcode:
// warum war Cur als Integer und Max als Int64?
// bei Dateien über 2 GB wäre Cur wohl etwas überlastet
procedure TForm1.UpdateProgressbar(Sender: TObject; const Cur, Max: Int64);
begin
  // kann man auch einmal direkt im OI zuweisen
  //ProgressBar1.Max := 100;

  // weiß jetzt nur nicht was schneller ist,
  // aber vermutlich doch die in der FPU, als emulierten 64-Bit-Operationen ...
  // hab also nix gesagt ._.
  ProgressBar1.Position := (Cur * 100) div Max * 100;

  // wenn eh schon Format da ist, warum nicht gleich weiternutzen ;)
  Form1.Caption := Format('%d%% Speed: %3.3f Sec.', [ProgressBar1.Position, (GetTickCount - Tick) / 1000]);
end;
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
 
#7
  Alt 30. Apr 2009, 10:45
Zitat von himitsu:
Delphi-Quellcode:
// warum war Cur als Integer und Max als Int64?
// bei Dateien über 2 GB wäre Cur wohl etwas überlastet
Dit war noch aus dem ersten Versuch, als ich Max und Position die Werte direkt zugewiesen habe und nicht über die Prozentrechnung gegangen bin... wird gefix...
Zitat von himitsu:
Delphi-Quellcode:
  // wenn eh schon Format da ist, warum nicht gleich weiternutzen ;)
  Form1.Caption := Format('%d%% Speed: %3.3f Sec.', [ProgressBar1.Position, (GetTickCount - Tick) / 1000]);
end;
Wird auch noch angepasst, wobei man ja dazu sagen muss, dass das Fehler sind, die die Unit nicht direkt betreffen. Das Testprogramm nutze ich nachher ja nicht weiter...
米斯蘭迪爾
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#8
  Alt 30. Apr 2009, 10:58
Also die Definition der Callbackprozedur ist schon 'ne Sache aus der Unit.
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
 
#9
  Alt 30. Apr 2009, 11:01
Zitat von himitsu:
Also die Definition der Callbackprozedur ist schon 'ne Sache aus der Unit.
*knirsch* Stümmt...
米斯蘭迪爾
  Mit Zitat antworten Zitat
Benutzerbild von hazard999
hazard999
 
#10
  Alt 30. Apr 2009, 13:33
Form1.Caption := Format('%d%% Speed: %3.3f Sec.', [ProgressBar1.Position, (GetTickCount - Tick) / 1000]);

wenn ich sowas schon seh *argh*

Caption := Format('%d%% Speed: %3.3f Sec.', [ProgressBar1.Position, (GetTickCount - Tick) / 1000]);

self.Caption := Format('%d%% Speed: %3.3f Sec.', [ProgressBar1.Position, (GetTickCount - Tick) / 1000]);

was besser gefällt

aber ja nicht Form1...


warum verwendest du das Testprogramm nicht weiter?

super Vorlage für einen Unit-Test oder ein Demo.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 07:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz