AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi TFileStream langsam wenn kein fmCreate?
Thema durchsuchen
Ansicht
Themen-Optionen

TFileStream langsam wenn kein fmCreate?

Ein Thema von Gruber_Hans_12345 · begonnen am 5. Nov 2013 · letzter Beitrag vom 8. Nov 2013
Antwort Antwort
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#1

TFileStream langsam wenn kein fmCreate?

  Alt 5. Nov 2013, 09:21
hallo

Ich habe zwei Anwendungen, die erste soll eine Datei erzeugen und ständig in diese schreiben (eine Art log datei)
Die zweite Anwendung öffnet diese Datei lesend, und liest diese eben zyklisch aus

Im ersten Szenario, habe ich beim erzeugen fmCreate angegeben., dadurch kann ich nicht lesend auf die Datei zugreifen aus der zweiten App und ein schreibvorgang dauert ca 4ms

Wenn ich nun aber die daten mit fmWrite or fmShareDenyNone öffne dann dauert der schreibvorgang auch nur 4ms

Sobald ich aber einmal mit der zweiten Anwendung lesend auf die Datei zugreife (es wird ein TFileStream.Crate der danach wieder mit Free freigegeben wird) dann macht auch das schrieben probleme

das heisst der selbe Schreibvorgang dauert auf einmal ca 200 ms

ist das normal?

Oder wo schaue ich falsch und machen einen Fehler?
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: TFileStream langsam wenn kein fmCreate?

  Alt 5. Nov 2013, 09:34
Ich habe zwei Anwendungen, die erste soll eine Datei erzeugen und ständig in diese schreiben (eine Art log datei)
Die zweite Anwendung öffnet diese Datei lesend, und liest diese eben zyklisch aus
Der Ansatz ist per se schon mal fragwürdig. Durch den gleichzeitigen Zugriff zweier Prozesse werden die Buffer komplett unterlaufen. Das könnte deine Probleme ausmachen.

Alternative 1:
Beim Schreiben wird an eine bestehende Datei angehängt bzw. erst eine neue erzeugt. (logisch)
Beim Lesen wird eine bestehende Datei vor dem Öffnen umbenannt. Andernfalls gibt es nichts zu lesen.

Alternative 2:
Du schreibst eine Server-Anwendung, die das Schreiben und Lesen zentral übernimmt. Eventuell kann das Log in diesem Fall sogar im Speicher bleiben.

Alternative 3:
Du verwendest eine Datenbank.

Es gibt sicher noch weitere...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#3

AW: TFileStream langsam wenn kein fmCreate?

  Alt 5. Nov 2013, 12:08
Hmmmm

Will weder ne DB noch einen Service verwenden, da das loggin schon mit der ersten programmzeile funken sollten, und auch geloggt werden sollten wenn mit der DB oder so was nicht funkt ... ohne viel overhead.

Was mir aber eben komisch vorkommt
wenn ich mit Create(FileName, fmOpenReadWrite or fmShareDenyWrite); starte
dann 20 * Blöcke mit ca 1000 Bytes schreibe -> dann geht das zügig

dann macht die Schreibanwendung mal nix (hat aber den Stream noch offen)

jetzt kommt die Leseanwendung und liest auf einmal die ganze Datei, und schließt den Filestream

danach geht das schreiben mit der immer noch offenen Anwendung extremst träge ...
Gruss Hans

2B or not 2B, that is FF
  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
 
#4

AW: TFileStream langsam wenn kein fmCreate?

  Alt 5. Nov 2013, 13:08
Für einen reibungslosen Zugriff auf die Log-Datei, solltest du die Datei zum Schreiben öffnen, die Daten schreiben und dann die Datei wieder schließen.

Dann dürfte es auch keine gravierenden Geschwindigkeitseinbußen geben.
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
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: TFileStream langsam wenn kein fmCreate?

  Alt 5. Nov 2013, 14:40
Also TFileStream ist über jeden Verdacht erhaben denn die Klasse ist nur eine ganz dünne Schicht über den Windows-API-Funktionen CreateFile, ReadFile, WriteFile, CloseHandle.
Es gibt keinen Buffer oder irgendein Eigenleben in dieser Klasse.

Ein Virenscanner könnte auf die veränderte Logdatei reagieren und im Hintergrund einen Scanvorgang starten.
Früher haben die Virenscanner die Datei über die offizielle API ausgelesen.
Das hat manchmal dazu geführt dass die Datei für kurze Zeit nicht durch die Anwendung geöffnet werden konnte.
Heutzutage sind Virenscanner noch tiefer im Kernel verankert.
Der Virenscanner könnte deine Anwendung ohne weiteres in dem API-Aufruf blockieren bis sein Scanvorgang beendet ist.

Ich habe sowieso nie verstanden weshalb manche Virenscanner per Default ALLE Dateien scannen; also auch Logdateien und Sourcecode.
Aber das ist Einstellungssache.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: TFileStream langsam wenn kein fmCreate?

  Alt 5. Nov 2013, 14:55
Ich habe sowieso nie verstanden weshalb manche Virenscanner per Default ALLE Dateien scannen; also auch Logdateien und Sourcecode.
Aber das ist Einstellungssache.
Weil sich viele Bösewichte eh nicht an die Dateiendungen halten. (sonst gäbe es ja ein .virus)

Und auch in Quellcodedateien verstecken sich gerne mal Viren, wie z.B. der schnucklige Delphi-"Virus", welcher die System.pas von Delphi 7 befallen hat.

Genauso könnte auch in Logdateien sich schädlicher "Code" verstecken, welcher z.B. in bestimmten LogViewern/LogParsern einen Buffer-Overrun auslösen könnte.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: TFileStream langsam wenn kein fmCreate?

  Alt 6. Nov 2013, 12:54
Weil sich viele Bösewichte eh nicht an die Dateiendungen halten. (sonst gäbe es ja ein .virus)
PS: http://www.heise.de/newsticker/meldu...o.beitrag.atom => gelingt es den Angreifern, über speziell präparierte TIFF-Grafiken, Code in die Rechner ihrer Opfer einzuschleusen.
$2B or not $2B
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#8

AW: TFileStream langsam wenn kein fmCreate?

  Alt 8. Nov 2013, 16:46
Für einen reibungslosen Zugriff auf die Log-Datei, solltest du die Datei zum Schreiben öffnen, die Daten schreiben und dann die Datei wieder schließen.

Dann dürfte es auch keine gravierenden Geschwindigkeitseinbußen geben.
Genauso würde ich es auch machen bzw. mache ich das auch heute noch, wenn's denn schon mal keine DB sein soll/darf/kann. Noch zu DOS-Zeiten war das schon so, und es hat im Netzwerk mit vielen Usern funktioniert. Damals waren es eben typisierte Dateien. Heute macht man das mit Streams, das ist aber schon der einzige Unterschied.

Für den Shared-Zugriff erstellt man während des Schreibvorganges eine temporäre Lock-Datei, die beispielsweise das Suffix '.$$$' hat. Wenn nun die Lockdatei existiert, wartet der Client mit dem lesen eine einstellbare Zeit (ca. 2 Sekunden) darauf, dass sie wieder verschwindet (sprich vom schreibenden Prozess gelöscht wird). Ist das nicht der Fall, hat sich der schreibende Prozess wohl verabschiedet. Dann versucht der Client vielleicht alternativ noch, die Lockdatei zu löschen. Funktioniert auch das nicht, muss wohl der Admin ran. Aber, ich kann mich - ausser bei Systemabstürzen - nicht daran erinnern.
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:36 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