Forum: PC-Programmierung Schreiben mit fstream| Vorgänge auf Festplatte


von A. R. (redegle)


Lesenswert?

Hallo,

ich habe eine Frage dazu, was im Hintergrund passiert, wenn mit fstream 
eine Binärdatei beschrieben wird. Das Szenario ist folgendes:

Ein Rechner bekommt jede Sekunde mehrere Daten.
Bei jedem Datenempfang wird eine Funktion angestroßen.
Diese analysiert die empfangenen Daten, öffnet je nach Inhalt eine 
Binärdatei, fügt dort Daten hinzu und schließt die Datei.

Ablauf von fstream ist also öffnen, ergänzen, schließen.

Ich gehe davon aus, dass beim Ergänzen der Datei nicht einfach Bytes ans 
Ende angehangen werden können. Bedeutet dies dann, das im Hintergrund 
ähnlich wie bei realloc(), die Datei gelöscht und eine neue Datei 
inklusive zusätzlicher Bytes geschrieben wird?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

A. R. schrieb:
> Ich gehe davon aus, dass beim Ergänzen der Datei nicht
> einfach Bytes ans Ende angehangen werden können.

Und wieso? Die Douk sagt das es verschiedene Modi gibt:
http://www.cplusplus.com/reference/iostream/fstream/fstream/

Ansonsten wäre ausprobieren (mit einer unwichtigen Datei) doch 100x 
schneller als hier auf Antworten zu warten...

von Klaus W. (mfgkw)


Lesenswert?

A. R. schrieb:
> Ich gehe davon aus, dass beim Ergänzen der Datei nicht einfach Bytes ans
> Ende angehangen werden können.

Wieso nicht?
Wenn im letzten Sektor bzw. Cluster oder Block (je nach Sichtweise) noch 
Platz ist, werden die neuen Byte dort abgelegt,; ansonsten kommt halt 
der nächste Block dazu (der bei keinem aktuellen Dateisystem direkt 
dahinter liegen muß, sondern beliebig irgendwo herumliegen kann - sogar 
bei FAT).

Wo ist das Problem?

von Klaus W. (mfgkw)


Lesenswert?

Läubi .. schrieb:
> Ansonsten wäre ausprobieren (mit einer unwichtigen Datei) doch 100x
> schneller als hier auf Antworten zu warten...

Ein Neuling in diesem Forum wie du wundert sich noch über solche Fragen, 
aber das lässt mit der Zeit nach....

Ach, du bist ja gar nicht neu hier. Dann verwundert mich dein Einwand 
jetzt doch etwas :-)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Man wird doch noch auf Einsicht hoffen dürfen :-)

von Klaus W. (mfgkw)


Lesenswert?

Weil Weihnachten ist, sei es dir nachgesehen.

Aber sonst sind solche Gedanken nicht gut für den Blutdruck!

von A. R. (redegle)


Lesenswert?

>Und wieso? Die Douk sagt das es verschiedene Modi gibt:
>http://www.cplusplus.com/reference/iostream/fstream/fstream/

>Ansonsten wäre ausprobieren (mit einer unwichtigen Datei) doch 100x
>schneller als hier auf Antworten zu warten...

Ich bin mir über die Funktionalität fstream im klaren. Vielleicht ist 
meine Frage auch schlecht fomuliert. Dir sei versichert, dass ich schon 
genug ausprobiert habe bevor ich hier gepostet habe.

Nur weil fstream es mir ermöglicht, Daten direkt an eine Datei 
anzuhängen bedeutet dies noch nicht, dass dies immer Sinnvoll ist. Auf 
diesen Aspekt zielte meine Frage ab.

>Wieso nicht?
>Wenn im letzten Sektor bzw. Cluster oder Block (je nach Sichtweise) noch
>Platz ist, werden die neuen Byte dort abgelegt,; ansonsten kommt halt
>der nächste Block dazu (der bei keinem aktuellen Dateisystem direkt
>dahinter liegen muß, sondern beliebig irgendwo herumliegen kann - sogar
>bei FAT).

>Wo ist das Problem?

Eben genau das war die Frage. Bzw. ist auch schon die Antwort.
Mein Laufwerk ist z. B. NTFS formatiert. Laut Wikipedia ist also ein 
Standardclustor 4096Bytes groß. Meine Anwendung ergänzt jede Sekunde pro 
Datei 25Bytes. Also Fallen pro Tag pro Datei 86400 Zugriffe statt. Die 
Daten kommen nicht jede Sekunde und es findet eine Interpolation statt 
also sind es geschätzt 20000Zugriffe pro Tag pro Datei.
Pro Datei pro Tag sind das dann 2.160.000Bytes oder 528 Cluster.
Da ich ca. 100 verschiedene Daten beschreibe (es sind 100 verschiedene 
Datenquellen verfügbar) finden also pro Sekunde maximal 
100Schreibvorgänge statt. Wobei vor jedem Schreibvorgang zuerst die 
Datei auf existenz geprüft wird und die letzte Messzeit gelesen wird.

Das Programm existiert und läuft seit etwa 2 Wochen problemlos.

Die Frage ist nun, ob dieses Konzept so sinnvoll ist. Hier fehlen mir 
leider die Praxiserfahrungen.
Es müssen extrem viele Zugriffe auf die Festplatte stattfinden.
Im Worst Case besteht eine 2MB große Datei später aus 489 Clustern die 
sich an verschiedenen Orten der Festplatte befinden.

Ich könnte mir vorstellen, zuerst 2MB an Daten im RAM 
zwischenzuspeichern. Dies würde aber erschweren, jederzeit Zugriff (von 
einem anderen Rechner) auf diese Daten zu habe.

von Klaus W. (mfgkw)


Lesenswert?

A. R. schrieb:
> Die Frage ist nun, ob dieses Konzept so sinnvoll ist. Hier fehlen mir
> leider die Praxiserfahrungen.

Möglicherweise ist es sinnvoller, alles in eine Datei zu werfen (ohne 
dauernd zu öffnen und zu schließen) und davon entkoppelt von einem 
anderen Programm auseinanderdröseln zu lassen.

Es kann auch sein, daß eine DB damit besser zurecht kommt.

Andererseits: wenn es so funktioniert, ist es doch auch gut, oder nicht?

von Klaus W. (mfgkw)


Lesenswert?

A. R. schrieb:
> Im Worst Case besteht eine 2MB große Datei später aus 489 Clustern die
> sich an verschiedenen Orten der Festplatte befinden.

Das ist nicht dein Problem, dafür gibt es ein Dateisystem.

von Karl H. (kbuchegg)


Lesenswert?

> Es müssen extrem viele Zugriffe auf die Festplatte stattfinden.

Wobei noch gar nicht feststeht, ob diese Zugriffe überhaupt alle 
unmittelbar auf die Festplatte durchgeschliffen werden. Zwischen deinem 
fstream und der tatsächlichen Festplatte sitzen noch das Betriebssystem 
(dort wieder im Speziellen das Dateisystem), der Plattentreiber und 
nicht zuletzt auch noch diverse Caches, sowohl im BS als auch in der 
Festplatte. Nur weil dein fstream schreibt, heißt das noch lange nicht, 
dass sich da jetzt sofort und unmittelbar ein Schreib/Lesekopf der 
Platte auf den Weg macht.

von Rolf M. (rmagnus)


Lesenswert?

Allerdings wird das ständige öffnen und schließen die Zahl an Zugriffen 
nicht gerade verringern.

Wenn du die finale Größe der Datei kennst oder zumindest eine maximale 
Größe, kannst du auch im voraus eine Datei dieser Größe anlegen und dann 
später die Daten eben überschreiben, um die Fragmentierung zu 
reduzieren.

von Robert L. (lrlr)


Lesenswert?

dazu 2 "Gedanken":

Defragmentierung:
aka: >Das ist nicht dein Problem, dafür gibt es ein Dateisystem.

natürlich ist das ein Problem (außer bei SSD) ..

es wäre Sinnvoller die Datei immer z.b. 10MBYte wachsen zu lassen, (dazu 
muss man aber auch noch speichern wo das Dateiende ist)

Datensicherheit: wenn man damit leben kann, dass nach einem 
Stromausfall, die Daten von ein paar Minuten weg sind, würde ich nicht 
jedes mal öffnen/schließen

andererseites (wenn wirklich jeder wert wichtig ist, muss man bei 
(vorallem bei) NTFS eh aufpassen,  und den schreib-cache "umgehen" ..)

(komisch finde ich übrigens, dass noch keiner eine datenbank (mysql) 
vorgeschlagen hat, dass ist normalerweise immer das erste dass 
irgendjemand bei solchen threads postet... ;-)

edit: ich sehe gerade, dass doch schon jemand eine DB ins spiel gebracht 
hat..

von Klaus (Gast)


Lesenswert?

Robert L. schrieb:
> Datensicherheit: wenn man damit leben kann, dass nach einem
> Stromausfall, die Daten von ein paar Minuten weg sind, würde ich nicht
> jedes mal öffnen/schließen

Das verstehe ich jetzt nicht. Kannst du das mal erklären?

MfG Klaus

von Robert L. (lrlr)


Lesenswert?

solange die Datei offen ist, werden die Daten nicht auf die platte 
geschrieben (bzw. nur "sporadisch")

bei FAT32 hast du dann nach einem Stromausfall inkonsistente Daten

bei (neueren) NTFS hast du
http://de.wikipedia.org/wiki/Journaling

und damit den "letzten" konsistenten stand..

wobei eben auch beim schließen einer Datei nicht SOFORT geschrieben wird 
(wegen schreib-cache)
deshalb muss man NTFS formatierte usb-festplatten auch "sicher trennen" 
usw.

von Peter II (Gast)


Lesenswert?

Robert L. schrieb:
> deshalb muss man NTFS formatierte usb-festplatten auch "sicher trennen"
> usw.

nö, denn seit Vista sind Wechseldatenträger die option "für schnelles 
entfernen" aktiviert.

von Klaus W. (mfgkw)


Lesenswert?

Bevor es hier entgleist:
1. Es geht nicht um Wechseldatenträger.
Ob auf einem USB irgendwas aktivirt ist oder nicht, hat doch mit diesem 
Thread nichts zu tun.
2. Es geht um viele Dateien (Größenordnung 100). Da ist es nicht 
sinnvoll, alle Dateien geöffnet zu halten.

von Peter II (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Es geht um viele Dateien (Größenordnung 100). Da ist es nicht
> sinnvoll, alle Dateien geöffnet zu halten.

warum nicht, selbst dos kannte damit schon umgehen. 100 ist ja wohl 
nicht viele. Finde ich zu mindest sinnvoller als ständig zu öffnen und 
zu schießen. Auch die Abfrage ob die Datei braucht man eigentlich nur 
einmal zu machen. Die Frage ist aber ob gleichzeitig mit den Datein 
etwas anders gemacht wird.

von Robert L. (lrlr)


Lesenswert?

Interessant

ich hab allerdings mit Win7 eine NTFS USB Festplatte (eigentlich eine 
ssd die testhalber in einem USB externen Gehäuse war)

beschrieben

und dabei festgestellt, dass win7 zuerst mit 70mbyte/sekunde geschrieben 
hat
und dann immer wieder pausen gemacht hat
(Vorallem ganz am schluss)

als ich diese dann (testhalber) mit Fat32 formatiert hatte, wurde 
konstant mit 20-30 (es war ein billig externens gehäuse, was nicht mehr 
her gibt) geschrieben wurde..



auch wenn es so sein sollte wie du schreibt
sollte man  trotzdem "sicher trennen" (um sicher zu stellen, dass nicht 
irgend ein Programm irgend eine Datei offen hat..)


>1. Es geht nicht um Wechseldatenträger.
>Ob auf einem USB irgendwas aktivirt ist oder nicht, hat doch mit diesem
>Thread nichts zu tun.

doch, es sollte dir allerdings nur als BEISPIEL dienen, damit du 
versteht, was bei einem Stromausfall passiert (was sich mit einer usb 
oder esata Festplatte einfach, einfacher simulieren lässt)

von Peter II (Gast)


Lesenswert?

Robert L. schrieb:
> und dabei festgestellt, dass win7 zuerst mit 70mbyte/sekunde geschrieben
> hat
> und dann immer wieder pausen gemacht hat
> (Vorallem ganz am schluss)
>
> als ich diese dann (testhalber) mit Fat32 formatiert hatte, wurde
> konstant mit 20-30 (es war ein billig externens gehäuse, was nicht mehr
> her gibt) geschrieben wurde..

wenn es ein billig externens gehäuse war, dann war ist vermutlich noch 
USB2.0 dann kann etwas mit den 70Mbyte/s nicht stimmen.

von Robert L. (lrlr)


Lesenswert?

sag ich ja

+
>und dann immer wieder pausen gemacht hat


(ich war/bin einfach der Meinung, dass das der schreib Cache ist..)

von Rolf M. (rmagnus)


Lesenswert?

Robert L. schrieb:
> dazu 2 "Gedanken":
>
> Defragmentierung:
> aka: >Das ist nicht dein Problem, dafür gibt es ein Dateisystem.
>
> natürlich ist das ein Problem (außer bei SSD) ..

Gerade bei SSDs ist es ein Problem.

Klaus Wachtler schrieb:
> Bevor es hier entgleist:
> 1. Es geht nicht um Wechseldatenträger.
> Ob auf einem USB irgendwas aktivirt ist oder nicht, hat doch mit diesem
> Thread nichts zu tun.
> 2. Es geht um viele Dateien (Größenordnung 100). Da ist es nicht
> sinnvoll, alle Dateien geöffnet zu halten.

Ich finde es eher nicht sinnvoll, alle 100 Dateien einmal pro Sekunde zu 
öffnen und wieder zu schließen.

von Peter II (Gast)


Lesenswert?

Rolf Magnus schrieb:
>> Defragmentierung:
>> aka: >Das ist nicht dein Problem, dafür gibt es ein Dateisystem.
>>
>> natürlich ist das ein Problem (außer bei SSD) ..
>
> Gerade bei SSDs ist es ein Problem.

warum sollte Fragmentierung bei SSD ein Problem sein? Da die 
Adresssierungszeit fast 0 ist spielt es doch keine Rolle wie die Daten 
angeordnet sind.

von Rolf M. (rmagnus)


Lesenswert?

Peter II schrieb:
> Rolf Magnus schrieb:
>>> Defragmentierung:
>>> aka: >Das ist nicht dein Problem, dafür gibt es ein Dateisystem.
>>>
>>> natürlich ist das ein Problem (außer bei SSD) ..
>>
>> Gerade bei SSDs ist es ein Problem.
>
> warum sollte Fragmentierung bei SSD ein Problem sein?

Weil eine SSD die Daten intern in viel größeren Blöcken als das 
Dateisystem verwaltet. Und wenn nur ein Teilblock geschrieben werden 
soll, bedeutet das für die SSD, daß sie erst den ganzen Block in einen 
Zwischenspeicher einlesen, den neuen Teil einsetzen und dann das ganze 
wieder rausschreiben muß.

von Peter II (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Weil eine SSD die Daten intern in viel größeren Blöcken als das
> Dateisystem verwaltet.

wenn er aber eh immer 50byte nur auf einmal rausschreiben will, spielt 
das überhaupt keine Rolle. Dann dabei wird niemals ein Block voll. Es 
muss also immer erst gelesen werden.

Wie groß sind eigentlich die Blöcke in der SSD? Ich hätte gedacht 4k und 
dann würde es sehr gut zum NTFS passen.

von Rolf M. (rmagnus)


Lesenswert?

Peter II schrieb:
> wenn er aber eh immer 50byte nur auf einmal rausschreiben will, spielt
> das überhaupt keine Rolle. Dann dabei wird niemals ein Block voll. Es
> muss also immer erst gelesen werden.

Wenn die Datei allerdings gelöscht wird, bleibt danach quasi eine 
"Kraterlandschaft" zurück, die dann für das Anlegen neuer Dateien nicht 
gerade ideal ist.

> Wie groß sind eigentlich die Blöcke in der SSD? Ich hätte gedacht 4k und
> dann würde es sehr gut zum NTFS passen.

Es gibt zwei Blockgrößen. Eine "Page" ist meist 4k groß, aber gelöscht 
werden können nur größere Blöcke, sogenannte "Erasable Blocks", für die 
laut Wikipedia gilt:

> Alle seit 2009 gängigen MLC-Laufwerke verwenden jedoch durchgängig Größen
> von 512 KB.

von Robert L. (lrlr)


Lesenswert?

stimmt, bei SSD hab ich mich schlecht ausgedrückt:

Fragmentierung ist KEIN problem
aber immer nur 25 Byte schreiben, natürlich schon.

>Wie groß sind eigentlich die Blöcke in der SSD? Ich hätte gedacht 4k und
>dann würde es sehr gut zum NTFS passen.

kann man nicht mehr sagen/bestimmen
weil die Daten bei den z.b. neuen Sanforce? auch komprimiert werden 
(automatisch)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.