5 votes

Lire le fichier entier en mémoire VS lire par morceaux

Je suis relativement novice en matière de C# et de programmation, alors soyez indulgent avec moi. Je travaille sur une application où je dois lire des fichiers et les traiter par morceaux (par exemple, les données sont traitées par morceaux de 48 octets).

J'aimerais savoir ce qui est le plus performant, du point de vue des performances, de lire tout le fichier en une seule fois en mémoire et de le traiter ensuite, ou de lire le fichier par morceaux et de les traiter directement, ou encore de lire les données par gros morceaux (plusieurs morceaux de données qui sont ensuite traités).

Comment je comprends les choses jusqu'à présent :

Lire tout le fichier en mémoire
pros :
-Il est rapide, car l'opération la plus coûteuse en temps est la recherche, une fois la tête en place, la lecture est assez rapide.

contre :
-Il consomme beaucoup de mémoire
-Il consomme beaucoup de mémoire en très peu de temps (c'est ce que je crains le plus, car je ne veux pas que cela ait un impact notable sur les performances globales du système).

Lire le fichier par morceaux
pros :
-C'est plus facile (plus intuitif) à mettre en œuvre.

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

-Il consomme très peu de mémoire

contre :
-Il pourrait prennent beaucoup plus de temps, si le disque doit rechercher à nouveau le fichier et déplacer la tête à la position appropriée, ce qui coûte en moyenne environ 12 ms.

Je sais que la réponse dépend de la taille du fichier (et du matériel). Je suppose qu'il est préférable de lire l'ensemble du fichier en une seule fois, mais pour quelle taille de fichier est-ce vrai ? quelle est la taille maximale recommandée pour lire en mémoire en une fois (en octets ou par rapport au matériel - par exemple % de RAM) ?

Merci pour vos réponses et votre temps.

7voto

Aliostad Points 47792

Il est recommandé de lire les fichiers dans des tampons de 4K ou 8K .

Vous ne devriez jamais lire les fichiers en une seule fois si vous voulez le réécrire dans un autre flux. . Il suffit de lire dans un tampon et de réécrire le tampon. Ceci est particulièrement utile pour la programmation web.

Si vous devez charger tout le fichier parce que votre opération (traitement de texte, etc.) a besoin de tout le contenu du fichier, la mise en mémoire tampon n'est pas vraiment utile. de préférence à utiliser File.ReadAllText o File.ReadAllBytes .


Pourquoi 4KB ou 8KB ?

Ceci est plus proche des tampons sous-jacents du système d'exploitation Windows. Les fichiers dans NTFS sont normalement stockés dans des blocs de 4 ou 8 Ko sur le disque, mais vous pouvez choisir des blocs de 32 Ko.

1voto

Petr Abdulin Points 7297

Votre morceau doit être juste assez grand, 48 bytes est bien sûr trop petit, 4K est raisonnable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X