Leggi l’intero file in memoria VS leggi in blocchi

Sono relativamente nuovo a C # e alla programmazione, quindi per favore portami con me. Sto lavorando a un’applicazione in cui ho bisogno di leggere alcuni file ed elaborare quei file in blocchi (ad esempio i dati vengono elaborati in blocchi di 48 byte).

Mi piacerebbe sapere cosa è meglio, in termini di prestazioni, leggere l’intero file in una sola volta in memoria e poi elaborarlo o leggere file in blocchi e processarli direttamente o leggere i dati in blocchi più grandi (più blocchi di dati che sono quindi elaborato).

Come capisco le cose finora:

Leggi l’intero file in memoria
professionisti:
-E ‘veloce, perché l’operazione più dispendiosa in termini di tempo sta cercando, una volta che la testina è a posto, può leggere abbastanza velocemente

contro:
-Sta consuma molta memoria
-Esso consuma molta memoria in brevissimo tempo (questo è ciò di cui sono principalmente spaventato, perché non voglio che ciò influisca notevolmente sulle prestazioni generali del sistema)

Leggi il file in blocchi
professionisti:
-È più facile (più intuitivo) da implementare

while(numberOfBytes2Read > 0) read n bytes process read data 

-Sta consuma pochissima memoria

contro:
-Potrebbe richiedere molto più tempo, se il disco deve cercare nuovamente il file e spostare la testa nella posizione appropriata, che in media costa circa 12ms.

So che la risposta dipende dalla dimensione del file (e dall’hardware). Presumo che sia meglio leggere l’intero file in una volta, ma per quanto riguarda i file di grandi dimensioni questo è vero, qual è la dimensione massima consigliata da leggere in memoria contemporaneamente (in byte o relativa all’hardware – ad esempio% di RAM)?

Grazie per le vostre risposte e il tempo.

Si consiglia di leggere i file nei buffer di 4K o 8K .

Non dovresti davvero leggere mai tutti i file contemporaneamente se vuoi scriverlo su un altro stream . Basta leggere su un buffer e scrivere di nuovo il buffer. Questo è specialmente per la programmazione web.

Se devi caricare l’intero file dal momento che l’operazione (elaborazione del testo, ecc.) Ha bisogno dell’intero contenuto del file, il buffering non aiuta molto, quindi credo sia preferibile usare File.ReadAllText o File.ReadAllBytes .


Perché 4KB o 8KB?

Questo è più vicino ai sottostanti buffer del sistema operativo Windows. I file in NTFS sono normalmente archiviati in chunk 4KB o 8KB sul disco, sebbene sia ansible scegliere chunk da 32KB

Il tuo chunk deve essere solo di grande dimensione, 48 byte ovviamente è piccolo, il 4K è ragionevole.