Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Mit Puffer in Datei schreiben / Buffered Logfile

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
26.09.2006, 00:01 Uhr
Steve06



Hallo,

ich habe das Loggen (Aufzeichnen) von Informationen in eine Text-Datei bei mir realisiert (siehe Thread: www.fun-soft.de/showtopic.php?threadid=15999). Nur verlangsamt sich der Programmablauf bei der Bewältigung großer Datenmengen nun sehr stark, da alles mit dem <<-Operator in den Filestream geschrieben wird und es somit zu sehr vielen sehr kleinen Festplattenzugriffen kommt...
Mein Ziel ist nun über einen Puffer zu gehen. Ich habe gehört, dass alle Streamklassen erstmal in einen "streambuf"-Puffer schreiben, und von dort aus erst die Daten zum Ziel (Bildschirm oder Datei z.B.) weitergeben.
Ich weiß nun nicht wie ich den Stream-Puffer vergrößern kann, so dass möglichst wenige Festplattenzugriffe erfolgen.

Aber ich kann mir auch einen anderen Ansatz vorstellen:
Alle Daten zunächst in einen Stream mit dem Ziel Hauptspeicher statt Datei schreiben und erst zum Schluss des Programms den Inhalt dieses Arrays/Containers im Hauptspeichers durch schnelles blockweises Schreiben in die Datei kopieren. Nachteil: Stürzt das Programm vor dem regulären Ende ab, gelangt keine Information in die Logfile.
Wie würde man einen solchen Stream mit dem Ziel Hauptspeicher realisieren? Durch die strings- und die stringstream-Klasse?

Vielen Dank für Euren Input.

Cheers,
Steve
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.09.2006, 09:46 Uhr
ao

(Operator)



Zitat von Steve06:
Stürzt das Programm vor dem regulären Ende ab, gelangt keine Information in die Logfile.

Das kann, wenn die Log-Daten wichtig für die Obduktion sind, ein entscheidender Nachteil sein. Musst du gut überlegen, ob du das riskieren kannst.

Wenn die Verlangsamung extrem ist, dann hast du vielleicht viel zu viele Log-Befehle verstreut. Oder loggst du auf ein langsames Medium (Netzwerk mit hoher Auslastung, Festplatte kurz vor voll)?

Eine Alternative könnte sein, sogenannte "Trace-Level" zu verwenden und so zur Laufzeit die Informationen auszuwählen, die geloggt werden sollen.

Zitat:
Wie würde man einen solchen Stream mit dem Ziel Hauptspeicher realisieren? Durch die strings- und die stringstream-Klasse?

Ja, ich denke schon. Und dann regelmäßig dafür sorgen, dass der Puffer in die Datei geleert wird.

Dieser Post wurde am 26.09.2006 um 09:47 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.09.2006, 10:34 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich stimme ao zu.

Nur um zu verhindern, daß Du jetzt anfängst zusätzlich an den StreamBuffern zu schrauben:

Man kann mit entsprechenden Testprogrammen zeigen, daß eine Bufferung bei Blockorientierten Ausgabemedien (zB Harddisk) nur bis zu einem gewissen maße Performance bringt. In der Regel elediglich ein kleines Vielfaches der Block/Cluster Größe deines Ausgabemediums.

Du kannst auch davon ausgehen, daß die Streambuffer je nach Betriebssystem das Optimum für dich finden.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.09.2006, 10:39 Uhr
Pler
Einer von Vielen
(Operator)


Um das mit dem Hauptspeicher zu realisieren:
Könnte man nicht ein zweites Programm schreiben, so ne Art logdeamon. Dieser hat ein shared Memory mit dem anderen Programm zusammen.
Das Andere Programm schreibt dann seine Logdaten immer in den Memory und der logdeamon kann dann regelmäßig auf Festplatte schreiben.
Jetzt sind die Daten ja auch noch im Falle eines Absturzes des Hauptprogramms im shared-memory und der logger kann die noch in aller ruhe rausschreiben. Dazu kann er ja zur not per signal oder was getriggert werden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.09.2006, 14:06 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich würde das Rad nicht nochmal erfinden und zB http://log4cpp.sourceforge.net/ nutzen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.09.2006, 14:50 Uhr
Steve06



Danke an alle für Eure Vorschläge soweit.

@pler: Coole Idee, aber zu aufwendig für meine Bedürfnisse.

@virtual: eigentlich habe ich ja schon eine simple, funktionierende Lösung. Ich möchte mir gerne die Mühe ersparen eine Library von Dritten in meinen Code einzubauen


Ich denke ich möchte mir erstmal die Methode anschauen, wo alles über einen stringstream in einen String geschrieben wird und dann in die Datei kopiert wird.
Weiß jemand, wie man bei der Stringklasse vorab reichlich Speicher reservieren kann, so dass er nicht ständig den Speicherblock vergrößern/verschieben muss? Also eine Methode wie reserve bei der Container-Klasse vector...

Dieser Post wurde am 26.09.2006 um 15:05 Uhr von Steve06 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
26.09.2006, 15:14 Uhr
Spacelord
Hoffnungsloser Fall


reserve?

Gruss Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: