schreiben auf ein Netzlaufwerk mit fwrite()

MSP430

Grünschnabel
Hi Leute

Ich habe performance Probleme beim schreiben mit fwrite() auf ein Netzlaufwerk
wenn ich die Datei von lokaler HDD mit dem Windows Explorer auf das Netzlaufwerk per Drag&Drop kopiere funktioniert das fast doppelt so schnell als
wenn ich mit meinem Programm mit der Funktion fwrite() auf das Netzlaufwerk direkt schreibe. (Die daten fürs direkte schreiben werden zur Laufzeit erstellt. Im moment verwende ich ein struct mit char text[1024])

Hat jemand von euch eine Ahnung woran das liegen kann ? Ich vermute, das es wahrscheinlich an der Systempufferung von fwrite() liegt. Oder an einer Pufferung für das Netzwerk.

Vielen Dank schonmal für die Mühe
mfg, Sven
msp430@alpenjodel.de
 
Liest du irgendetwas schubweise ein um es dann zu schreiben oder wie?

Vielleicht liegt es dann ja nicht am Schreiben, sondern am Lesen.
 
Die Daten werden im Programm erzeugt. Ich habe zum Testen einfach einen char Puffer mit der Größe von 1024 Bytes angelegt, diesen Puffer schreibe ich dann mit
einer schleife
for(..1024*100.) { // 100 MB grosse Datei
fwrite(&puffer,sizeof(puffer),1,fd)
}

und erzeuge mir dadurch eine größere Datei. Später soll das nicht in einer schleife geschehen. Die daten werden mir dann über einen funktionsaufruf übergeben.

Ich habe mir noch folgendes überlegt. Vielleicht ist der unterschied zwischen kopieren und schreiben mittels fwrite() noch darin, das beim kopieren schon die Dateigröße zu begin gegeben des kopiervorgangs gegeben ist. Und bei fwrite wird ja immer nur ein Block von Daten übergeben (bedingt durch die übergabe der daten und der Systempufferung von fwrite) und die Datei Zielgröße ist nicht vorhanden, das auch nur immer soviel Speicher allokiert wird wie ich für einen fwrite() aufruf brauche (oder besser gesagt wieviel von fwrite() gepuffert wird.

mfg, Sven
msp430@alpenjodel.de
 
Die Daten werden im Programm erzeugt. Ich habe zum Testen einfach einen char Puffer mit der Größe von 1024 Bytes angelegt, diesen Puffer schreibe ich dann mit
einer schleife
for(..1024*100.) { // 100 MB grosse Datei
fwrite(&puffer,sizeof(puffer),1,fd)
}
Das sind wenn dann nur 100 Kb und nicht 100MB.
Die Geschwindigkeit hängt sehr stark von der Blockgröße ab. Wenn man eine Datei Kopiert, dann wird eine Blockgröße verwenden (z.B. 64k oder mehr) somit geht das dann auch wesentlich schneller wenn man weniger größere Stücke schreibt, wie wenn man mehr kleinere Stücke schreibt.
Außerdem sollte man darauf achten, das beim Netzwerk nicht übermäsig viel "ge-seekt" wird, denn das kostet Performance.

Gruß Homer
 
Das sind wenn dann nur 100 Kb und nicht 100MB.
Das sind schon 100 MB da der char Puffer 1024 Bytes groß ist -> 1kByte
und in der schleife schreibe diese 1kByte dann 1kByte * 1024*100 = 100MB

Ich schreibe dadurch halt nur Blöcke die 1kByte groß sind. Ich habe mal die Block größe die ich auf einmal schreibe erhöht. Zum testen habe ich 1024*512 Bytes gewählt.
Und siehe Da.. es ist viel schneller geworden.

Viele Dank für die Hilfe..
Gruß Sven
msp430@alpenjodel.de
 
Das sind schon 100 MB da der char Puffer 1024 Bytes groß ist -> 1kByte
Achso das wusste ich nicht.
Ich schreibe dadurch halt nur Blöcke die 1kByte groß sind. Ich habe mal die Block größe die ich auf einmal schreibe erhöht. Zum testen habe ich 1024*512 Bytes gewählt.
Sag ich doch :-) , nur achte darauf, je größer die Blockgröße, desto mehr RAM brauchst du, also das musst du je nach Datenaufkommen dynamisch machen.

Gruß Homer

P.S.: das ist Post Nr. 1000 :-) :-)
 
Woher kann ich die Information bekommen ,wie groß der Systempuffer für fwrite() ist ? Wahrscheinlich ist die Größe ja in der iostream library festgelegt.
Die Puffergröße wird dann auch noch Betriebssystem abhängig sein, da ja fwrite() einen syscall machen muss.

Gruß Sven
msp430@alpenjodel.de
 
Mal so eine dumme Frage:

Wieso nutzt du nicht einfach die Windowsfunkitionen zum kopieren?
Also in etwa so:

Code:
befehl="copy";
befehl+=quelle;
befehl+="ziel"
System(befehl);
 
Zurück