Fichier I/O avec des cours d'eau - le meilleur de la mémoire taille de la mémoire tampon
Je suis en train d'écrire une petite bibliothèque d'e/S afin d'aider un plus grand (hobby) du projet. Une partie de cette bibliothèque remplit différentes fonctions sur un fichier qui est lu /écrit par la FileStream
objet. Sur chaque StreamReader.Read(...)
passer,
Je déclenche un événement qui sera utilisé dans l'application principale pour afficher les informations de progression. Le traitement de ce qui se passe dans la boucle est vaired, mais n'est pas trop de temps (il pourrait n'être qu'une simple copie de fichier, par exemple, ou peut impliquer de chiffrement...).
Ma principale question est: Quel est le meilleur mémoire taille de la mémoire tampon à utiliser? La réflexion sur les dispositions de disque, je ne pouvais prendre 2k, ce qui permettrait de couvrir un CD de taille de secteur et est une belle multiple de 512 octets du disque dur du secteur. Plus haut dans l'abstraction l'arbre, vous pourriez aller pour une grande mémoire tampon qui peut lire la totalité d'une GRAISSE cluster à la fois. Je me rends compte aujourd'hui, avec nos PC, je pourrais aller pour une plus gourmands en mémoire en option (un couple de MiB, par exemple), mais puis-je augmenter le temps entre les mises à jour de l'INTERFACE utilisateur et l'utilisateur perçoit moins réactive application.
En aparté, je suis finalement l'espoir de fournir une interface similaire à des fichiers hébergés sur serveur FTP /HTTP serveurs (sur un réseau local /fastish DSL). Quelle serait la meilleure mémoire taille de la mémoire tampon pour ceux (encore une "le meilleur des cas" compromis entre la perception et de performances)?
- Il peut être utile: stackoverflow.com/questions/19558435/...
- J'aurais pensé que l'OS ou Windows permettrait de maintenir son propre profil de capacités matérielles et des vitesses et de fournir un service qui recommande la meilleure taille de buffer pour un volume de stockage et d'activité (p. ex., lecture aléatoire/écrit vs en lecture/écriture séquentielle), qui aurait à prendre la conjecture.
- Double Possible de C# FileStream : Optimale taille de la mémoire tampon pour l'écriture de gros fichiers?
Vous devez vous connecter pour publier un commentaire.
Fichiers sont déjà tamponné par le cache du système de fichiers. Vous avez juste besoin de choisir une taille de mémoire tampon qui permet de ne pas FileStream pour faire le natif de Windows ReadFile() appel d'API pour remplir la mémoire tampon trop souvent. N'allez pas en dessous d'un kilo-octet, soit plus de 16 KO est un gaspillage de mémoire et manque de convivialité de la CPU Le cache L1 (généralement 16 ou 32 KO de données).
4 KO est un choix traditionnel, même si ce sera exactement la durée d'une page de mémoire virtuelle seulement par accident. Il est difficile de profil; vous finirez mesurer combien de temps il faut pour lire un fichier mis en cache. Qui s'exécute à des vitesses de RAM, 5 giga-octets/sec et si les données sont disponibles dans le cache. Il sera dans le cache de la deuxième fois que vous lancez votre test, et cela ne se produira pas dans un environnement de production trop souvent. Fichier I/O est complètement dominé par le lecteur de disque ou le NIC et est glaciers lent, la copie de données est peanuts. 4 KO fonctionnera très bien.
_DefaultCopyBufferSize
a une valeur de0x14000
(81920, ou 80K). Cependant, c'est pour la copie de flux de flux, pas de mise en mémoire tampon des données. Le BufferedStream Classe a une_DefaultBufferSize
de0x1000
(4096 ou 4k), ce serait une meilleure classe de regarder pour la compréhension de ce que la taille de la mémoire tampon de l' .NET framework utilise pour les cours d'eau.Quand je traite avec des fichiers directement à partir d'un objet de flux de données, j'utilise généralement de 4096 octets. Il semble être raisonnablement efficace à travers des e/S multiples domaines (système de fichiers local, LAN/SMB, flux réseau, etc.), mais je n'ai pas de profilés ou de quoi que ce soit. Chemin du retour quand, j'ai vu plusieurs exemples d'utilisation de cette taille, et c'est resté dans ma mémoire. Cela ne veut pas dire qu'il est le meilleur si.
"Ça dépend".
Vous devez tester votre application avec différentes tailles de mémoire tampon pour déterminer whis est le meilleur. Vous ne pouvez pas deviner à l'avance.
Je suppose que la valeur par défaut est généralement le meilleur, c'est pourquoi je
4096B
basé surinternal const int
variableDefaultBufferSize
dans FileStream classe.