Dimensione del buffer ottimale per il file buffer?

Sto scrivendo un’applicazione che ha bisogno di leggere file abbastanza grandi. Mi sono sempre chiesto quale sia la dimensione ottimale per il buffer di lettura su un moderno computer Windows XP. Ho cercato su Google e ho trovato molti esempi che avevano 1024 come dimensione ottimale.

Ecco un frammento di ciò che intendo:

long pointer = 0; buffer = new byte[1024]; // What's a good size here ? while (pointer < input.Length) { pointer += input.Read(buffer, 0, buffer.Length); } 

La mia applicazione è abbastanza semplice, quindi non sto cercando di scrivere alcun codice di benchmark, ma vorrei sapere quali dimensioni sono comuni?

Una dimensione del buffer di 1 k sembra un po ‘piccola. Generalmente, non esiste una dimensione del buffer “taglia unica”. È necessario impostare una dimensione del buffer che si adatti al comportamento dell’algoritmo. Ora, in generale, non è una buona idea avere un buffer veramente enorme, ma avere uno che è troppo piccolo o non in linea con il modo in cui elabori ogni chunk non è poi così grandioso.

Se stai semplicemente leggendo i dati di un chunk dopo l’altro interamente in memoria prima di elaborarli, userei un buffer più grande. Probabilmente userò 8k o 16k, ma probabilmente non più grande.

D’altra parte, se si stanno elaborando i dati in streaming, leggendo un blocco e quindi elaborandoli prima di leggere il successivo, i buffer più piccoli potrebbero essere più utili. Ancora meglio, se stai trasmettendo dati con una struttura, cambierei la quantità di dati letti per adattarli in modo specifico al tipo di dati che stai leggendo. Ad esempio, se stai leggendo dati binari che contengono un codice di 4 caratteri, un float e una stringa, vorrei leggere il codice di 4 caratteri in un array di 4 byte, oltre al float. Vorrei leggere la lunghezza della stringa, quindi creare un buffer per leggere l’intera porzione di dati di stringa contemporaneamente.

Se si sta eseguendo lo streaming di elaborazione dei dati, vorrei esaminare le classi BinaryReader e BinaryWriter. Questi ti permettono di lavorare con i dati binari molto facilmente, senza doversi preoccupare molto dei dati stessi. Consente inoltre di disaccoppiare il buffer di dimensioni dai dati effettivi con cui si sta lavorando. È ansible impostare un buffer di 16k sul stream sottostante e leggere con facilità i singoli valori di dati con BinaryReader.

Dipende da dove si traccia la linea tra il tempo di accesso e l’utilizzo della memoria. Più grande è il buffer, più veloce – ma più costoso in termini di memoria. la lettura in multipli della dimensione del cluster del File system è probabilmente la più efficiente, in un sistema Windows XP che utilizza NTFS, 4K è la dimensione predefinita del cluster.

È ansible visualizzare questo collegamento Dimensione cluster predefinita per NTFS, FAT e exFAT

Ciao.