Hallo zusammen,
In letzter Zeit habe ich viel mit Streams gearbeitet. Oft verwendet man einen buffer um die Daten kurz zu speichern.
In den meisten Beispielen ist die Buffergröße 1024.
Warum nimmt man immer diese Größe.?
Wie wirkt die Buffergröße auf die Performance?
Hallo T_B__,
Wie wirkt die Buffergröße auf die Performance?
eigentlich gar nicht, weil die Daten von FileStream eh intern gepuffert werden. Siehe auch Zeilenweise aus buffer lesen?
herbivore
größere Buffer => mehr Speicherverbrauch
kleinere Buffer => muss u.U. mehrfach lesen, weil der Buffer immer vollgelaufen war.
Original von herbivore
Zeilenweise aus buffer lesen?
Ich arbeite weniger mit Textstreams, sondern mit Binärstreams.
Original von Grollicus
größere Buffer => mehr Speicherverbrauch
kleinere Buffer => muss u.U. mehrfach lesen, weil der Buffer immer vollgelaufen war.
Ich habe die Performance mit verschiedenen Buffergrößen getestet.
größere Buffer -> mehr Speicher, aber auch schneller, da der Buffer nicht so oft vollläuft.
Warum nimmt man trotzdem so einen kleinen Wert für die Buffergröße? (1kByte)
Die heutigen Rechner haben doch genug Speicher.
Hallo T_B__,
Ich arbeite weniger mit Textstreams, sondern mit Binärstreams.
das ändert nichts am Prinzip.
Warum nimmt man trotzdem so einen kleinen Wert für die Buffergröße? (1kByte)
Wer ist man? Normalerweise würde ich mit File.ReadAllBytes arbeiten.
herbivore
Original von herbivore
Normalerweise würde ich mit File.ReadAllBytes arbeiten.
herbivore
Das geht nur bei Dateien.
Ich meine so was:
...
Stream s1 = ....
Stream s2 = ....
int read;
byte[] buffer = new byte[1024];
sw.Start();
do
{
read = s1.Read(buffer, 0, buffer.Length);
s2.Write(buffer, 0, read);
}
while (read > 0);
...
s1 kann z.B. ein ZipStream und s2 ein MemoryStream sein.
Hallo T_B__,
Das geht nur bei Dateien.
das ändert nichts am Prinzip, alles komplett zu lesen.
herbivore
Ich vermute eher, dass die Autoren deiner Beispiele eine gewisse Fixierung auf das Kilobyte haben.
Ich verwende meist Vielfache von 4096 Bytes, da das die Default-Clustergröße von NTFS ist. Ansonsten ist es - wie herbivore schon schrieb - meist (außer bei wirklich großen Dateien) ausreichend und einfacher die komplette Datei zu laden.
Ähm ...
Wie gross sind den die Daten?
Weil so ne OutOfMemoryException ist schnell geschmissen.
Wenns nur ein paar kB/MB sind kannst die schon komplett einlesen.
Wenn du es aber nicht einschätzen kannst, musst du die Schrittweise lesen.
Und an der Grösse musst du selber schrauben. Normalerweise ist es egal wie gross du den Buffer wählst.
Nur bei sehr zeitnahen Sachen musst du schauen wie du mit den empfangen Daten umgehst. Ich nehm oft 32kB.
Kannst ja mal mit unterschiedlichen Buffer Grössen ausprobieren und die Zeit messen.
Bei Standard Sachen dürfte da wohl kein grosser Unterschied sein.
Gruß,
Tom