J'essaie d'optimiser les performances de création de nombreux petits fichiers sur un disque SSD.Comment optimiser les performances d'écriture de fichiers simultanés C#
ConcurrentBag<string[]> cb = new ConcurrentBag<string[]>();
cb.AsParallel().ForAll(fa => File.WriteAllText(fa[0], fa[1]));
Nombre total de ConcurrentBag<string[]>
= 80048, cb.Sum(gbc => Encoding.UTF8.GetByteCount(gbc[1]));
retourne 393441217 octets.
Quelque part, je fais un xml.Save();
, ce qui crée un fichier ~ 750MB.
La première situation prend 3 minutes et 30 secondes. Les 20 secondes suivantes. Je comprends qu'il y a une surcharge pour gérer toutes les opérations d'écriture séparées, mais 3 minutes et 30 secondes semblent encore un peu longues. J'ai déjà essayé la parallélisation avec forall, ce qui a aidé assez bien (auparavant cela prenait entre 6 et 8 minutes pour terminer). Quelles autres modifications puis-je ajouter à mon code pour optimiser les performances de la création de fichiers en bloc?
Comment déterminer la taille de tampon appropriée? Ce n'est pas un disque traditionnel mais un SSD, si cela devait être déterminé en premier ... Avez-vous un exemple de concurrence avec File.WriteAllText ou StreamWriter? J'ai aussi essayé avec buffersize = 16384 (4 * par défaut) mais cela a causé une exception à la mémoire négative – BigChief
Je vous encourage toujours à passer à ConcurrentQueue, je mettrai à jour ma réponse avec un exemple. Les SSD sont également affectés (mais beaucoup moins). Voir https://technet.microsoft.com/en-us/library/cc938632.aspx et http://stackoverflow.com/questions/8803515/optimal-buffer-size-for-write2 –
J'ai modifié ma réponse –