Was ist die beste Puffergröße beim Verwenden von BinaryReader zum Lesen großer Dateien (1 GB)?

8

Ich lese Binärdateien und hier ist ein Beispiel:

%Vor%

Offensichtlich spielt die Puffergröße (16 * 1024) eine große Rolle in der Leistung. Ich habe gelesen, dass es von der I / O-Technologie ( SATA , SSD , SCSI , usw.) und auch die Fragmentgröße der Partition, auf der sich die Datei befindet (wir können während der Formatierung die Partition definieren).

Aber hier ist die Frage: Gibt es eine Formel oder bewährte Methode zum Definieren der Puffergröße? Im Moment definiere ich basierend auf Versuch und Irrtum.

Bearbeiten: Ich habe die Anwendung auf meinem Server mit verschiedenen Puffergrößen getestet, und ich bekomme die beste Leistung mit 4095 * 256 * 16 (16 MB) !!! 4096 ist 4 Sekunden langsamer.

Hier sind einige ältere Beiträge, die sehr hilfreich sind, aber ich kann den Grund nicht verstehen:

Amir Pournasserian 24.10.2013, 06:22
quelle

2 Antworten

5

" Sequenzielle Dateiprogrammierungsmuster und -leistung mit .NET " ist ein großartiger Artikel zur Verbesserung der I / O-Leistung .

Auf Seite 8 der dieser PDF-Datei wird angezeigt, dass die Bandbreite für Puffergrößen größer als acht Byte konstant ist . Beachten Sie, dass der Artikel 2004 geschrieben wurde und die Festplatte " Maxtor 250 GB 7200 RPM SATA-Festplatte " ist und das Ergebnis sollte sich durch die neuesten I / O-Technologien unterscheiden.

Wenn Sie nach der besten Leistung suchen, sehen Sie sich pinvoke.net oder die Seite 9 an der PDF-Datei zeigt die ungepufferte Datei Performance-Messungen bessere Ergebnisse:

  

In nicht gepufferten E / A werden die Daten der Festplatte direkt zwischen den Daten verschoben   Anwendungsadressraum und das Gerät ohne Zwischenprodukt   Kopieren.

Zusammenfassung

  • Verwenden Sie für einzelne Festplatten die Standardeinstellungen des .NET-Frameworks - sie bieten eine hervorragende Leistung für den sequentiellen Dateizugriff.
  • Ordnen Sie große sequenzielle Dateien (mit der SetLength () -Methode) vor, wenn die Datei erstellt wird. Dies verbessert normalerweise die Geschwindigkeit um etwa 13% im Vergleich zu einer fragmentierten Datei.
  • Zumindest für Festplatten-Arrays sind nicht gepufferte E / A-Module erforderlich, um die höchste Leistung zu erzielen - gepufferte E / A kann achtmal langsamer sein als nicht gepufferte E / A. Wir erwarten, dass dieses Problem in späteren Versionen von .NET Framework behoben wird.
  • Wenn Sie Ihre eigenen Puffer verwenden, verwenden Sie große Anfragegrößen (64 KB ist ein guter Anfang). Unter Verwendung des .NET-Frameworks kann ein einzelner Prozessor ein Disk-Array mit über 800 MB / s unter Verwendung von nicht gepufferten E / A lesen und schreiben.
user2956625 07.11.2013, 13:29
quelle
4

Es gibt keine beste oder schlechteste Puffergröße, aber Sie müssen sich einige Aspekte ansehen.

Da Sie C # verwenden, können Sie Windows verwenden, Windows verwendet NTFS und die Seitengröße beträgt 4 MB. Daher ist es ratsam, ein Vielfaches von 4096 zu verwenden. Ihre Puffergröße ist also 16*1024 = 4*4096 , und es ist eine gute Wahl, aber zu sagen, ob es besser oder schlechter als 16*4096 ist, können wir nicht sagen.

Alles hängt von der Situation und den Anforderungen für das Programm ab. Denken Sie daran, hier können Sie nicht die beste Option auswählen, aber nur einige besser. Ich empfehle, 4096 zu verwenden, aber Sie könnten auch Ihre eigene 4*4096 oder sogar 16*4096 verwenden, aber denken Sie daran, dass dieser Puffer auf dem Heap zugewiesen wird, so dass seine Zuweisung einige Zeit braucht, so dass Sie nicht wollen Zuweisen eines großen Puffers, z. B. 128*4096 .

    
ST3 24.10.2013 06:30
quelle