Inconvénients de l’utilisation de fichiers mappés en mémoire

Mon service Web écrit plusieurs milliers de transactions par minute et nous les enregistrons sur le disque dur.

Je testais différentes façons de sauvegarder ces fichiers et j’ai fait quelques tests avec des fichiers IO standard et des fichiers MemoryMapped. Dans mes résultats, écrire des fichiers (20 ko texte) avec des fichiers MemoryMapped est environ 4 fois plus rapide que l’IO standard et je n’ai trouvé aucun inconvénient.

Comme je n’ai pas beaucoup d’expérience avec cette technologie, croyez-vous que je pourrais avoir des problèmes pour les utiliser ou que vous ne voyiez aucun inconvénient?

Merci!

EDIT 1 , voici la source:

namespace FileWritingTests.Writers { public class MappedFileWriter : ITestWriter { public void Write(ssortingng content, ssortingng path,ssortingng id) { Byte[] data = System.Text.Encoding.UTF8.GetBytes(content); using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) using (MemoryMappedFile memoryMapped = MemoryMappedFile.CreateFromFile(fileStream, id, data.Count(), MemoryMappedFileAccess.ReadWrite, new MemoryMappedFileSecurity(), HandleInheritability.Inheritable, true)) { var viewStream = memoryMapped.CreateViewStream(); viewStream.Write(data, 0, data.Length); } } } } 

et voici le testeur:

  public TimeSpan Run(int iterations, Writers.ITestWriter tester, Ssortingng subfolder) { Console.WriteLine(" -- Starting test {0} with {1} file writings",subfolder, iterations.ToSsortingng()); Stopwatch stopWatch = new Stopwatch(); stopWatch.Reset(); stopWatch.Start(); for (int i = 1; i <= iterations; i++) { tester.Write(transaction, this.path + "\\" + subfolder + "\\" + "file_" + i.ToString() + ".txt", i.ToString()); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Console.WriteLine(" -- finish test {0} with {1} file writings. Time Elapsed: {2}", subfolder, iterations.ToString(), ts.TotalMilliseconds); return ts; } 

le testeur est appelé plusieurs fois et il existe plusieurs types de testeurs appelés à des fins de comparaison.

Le principal inconvénient des fichiers MMF est qu’ils consumnt de la RAM, ce qui rend le cache du système de fichiers moins efficace. Pas de problème avec de tels petits fichiers.

Un autre inconvénient, bien que certainement intentionnel, est que vous ne pouvez plus mesurer le coût d’écriture du fichier. C’est maintenant un travail effectué par le kernel, et non plus par votre programme. Il est toujours en cours, bien sûr, il n’existe pas de déjeuner gratuit. Il est concomitant avec le rest de l’exécution de votre programme, thread libre pour ainsi dire. Surveillez l’utilisation de la CPU par le processus “Système” dans le Gestionnaire des tâches. Encore une fois, il est très peu probable que le problème soit aussi problématique.

C’est une micro-optimisation, époustouflée par le coût de création du fichier. Qui oscille entre 20 et 50 ms sur une unité de disque de broche. N’oubliez pas d’inclure cela dans votre mesure. L’écriture des données de fichier fonctionne à des vitesses de bus de mémoire supérieures à 5 gigaoctets / s, en fonction du type de RAM dont dispose la machine. Ce que vous supprimez ne sont que les appels WriteFile () de bas niveau, ils sont maintenant effectués par le kernel. Vous pouvez essayer de tester avec un FileStream, utilisez un constructeur qui prend la valeur bufferSize . La valeur par défaut est 4096 octets, augmentez-le à 32 Ko afin qu’il n’y ait qu’un seul appel WriteFile (). Le principal avantage de cette façon de procéder est que vous n’avez pas à deviner la taille du fonds MMF à l’avance. Il devient très moche quand vous avez deviné trop bas.