474 votes

Meilleure façon de lire un fichier volumineux en tableau d’octets en c# ?

J’ai un serveur web qui lira les fichiers binaires volumineux (plusieurs Mo) en tableaux d’octets. Le serveur pourrait être la lecture de plusieurs fichiers en même temps (demandes de page différents) donc je cherche la manière plus optimisée pour y parvenir sans imposer le CPU trop. Est le code ci-dessous assez bon ?

903voto

Mehrdad Afshari Points 204872

Il suffit de remplacer le tout avec :

Toutefois, si vous êtes préoccupé par la consommation de mémoire, vous devriez pas lire le fichier entier en mémoire tout à la fois en tout. Vous devriez faire qui en morceaux.

83voto

Marc Gravell Points 482669

Je pourrais faire valoir que la réponse ici est généralement « ne pas ». Sauf si vous avez absolument besoin de toutes les données à la fois, pensez à utiliser un `` -based API (ou une variante de lecteur / iterator). C’est particulièrement important lorsque vous avez plusieurs opérations en parallèle (comme le suggère la question) pour minimiser la charge du système et de maximiser le débit.

Par exemple, si vous diffusez des données à un appelant :

44voto

Powerlord Points 43989

Je pense que ceci :

10voto

Joel Points 195

En fonction de la fréquence des opérations, la taille des fichiers et le nombre de fichiers que vous êtes en train de regarder, il y a d'autres problèmes de performance à prendre en considération. Une chose à retenir, c'est que chacun de vos tableaux d'octets sera publié à la merci du garbage collector. Si vous n'êtes pas la mise en cache aucun de données, vous pouvez créer beaucoup de déchets et de perdre la plupart de vos performances à l' % de Temps dans le GC. Si les morceaux sont plus gros que 85K, vous serez l'allocation pour les Objets Volumineux(LOH) qui nécessitera une collection de toutes les générations pour libérer de la place (ce est très cher, et sur un serveur d'arrêter tous de l'exécution en passe). En outre, si vous avez une tonne d'objets sur la liturgie des heures, vous pouvez vous retrouver avec LOH fragmentation (la liturgie des heures est jamais compactés) qui conduit à de mauvaises performances et de la mémoire des exceptions. Vous pouvez recycler le processus une fois que vous atteignez un certain point, mais je ne sais pas si c'est une bonne pratique.

Le point est, vous devriez considérer le cycle de vie complet de votre application avant de l'nécessairement juste la lecture de tous les octets en mémoire la façon la plus rapide possible, ou vous pourriez être de trading à court terme de la performance pour la performance globale.

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