web-dev-qa-db-fra.com

Quand utiliser des fichiers mappés en mémoire?

J'ai une application qui reçoit des morceaux de données sur le réseau et les écrit sur le disque. Une fois que tous les morceaux ont été reçus, ils peuvent être décodés/recombinés dans le fichier unique qu'ils représentent réellement.

Je me demande s'il est utile d'utiliser des fichiers mappés en mémoire ou non - d'abord pour écrire les morceaux simples sur le disque, deuxièmement pour le fichier unique dans lequel tous sont décodés.

Mon sentiment est que cela pourrait être utile uniquement pour le deuxième cas, quelqu'un a-t-il des idées à ce sujet?

Edit: c'est une application C #, et je ne prévois qu'une version x64. (Donc, rencontrer le problème du "plus grand espace libre contigieux" ne devrait pas être pertinent)

43
Pygmy

Les fichiers mappés en mémoire sont bénéfiques pour les scénarios dans lesquels une partie relativement petite (vue) d'un fichier considérablement plus grand doit être accédée à plusieurs reprises.

Dans ce scénario, le système d'exploitation peut aider à optimiser l'utilisation globale de la mémoire et le comportement de pagination de l'application en ne paginant que vers les parties les plus récemment utilisées du fichier mappé.

De plus, les fichiers mappés en mémoire peuvent exposer des fonctionnalités intéressantes telles que la copie sur écriture ou servir de base à la mémoire partagée.

Pour votre scénario, les fichiers mappés en mémoire peuvent vous aider à assembler le fichier si les morceaux arrivent en panne. Cependant, vous devrez toujours connaître à l'avance la taille finale du fichier.

De plus, vous ne devez accéder aux fichiers qu'une seule fois, pour écrire un morceau. Par conséquent, un avantage en termes de performances par rapport aux E/S asynchrones implémentées est peu probable, mais il peut être plus facile et plus rapide d'implémenter correctement votre programme d'écriture de fichiers.

Dans .NET 4, Microsoft a ajouté la prise en charge des fichiers mappés en mémoire et il existe des articles complets avec un exemple de code, par exemple http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx .

28
user33675

Les fichiers mappés en mémoire sont principalement utilisés pour la communication inter-processus ou l'amélioration des performances d'E/S.

Dans votre cas, essayez-vous d'obtenir de meilleures performances d'E/S?

Je déteste souligner les obsessions, mais Wikipedia donne un bon aperçu de la situation ... http://en.wikipedia.org/wiki/Memory-mapped_file

Plus précisément...

L'approche mappée en mémoire a son coût en défauts de page mineurs - lorsqu'un bloc de données est chargé dans le cache de page, mais pas encore mappé dans l'espace de mémoire virtuelle du processus. Selon les circonstances, les E/S de fichiers mappés en mémoire peuvent en fait être beaucoup plus lentes que les E/S de fichiers standard.

On dirait que vous êtes sur le point d'optimiser prématurément la vitesse. Pourquoi pas une approche de fichier standard, puis refactoriser les fichiers MM plus tard si nécessaire?

12
kervin

Je dirais que les deux cas sont pertinents. Écrivez simplement les morceaux à leur place dans le fichier mappé en mémoire, dans le désordre, au fur et à mesure qu'ils entrent. Cela n'est bien sûr utile que si vous savez où chaque morceau doit aller, comme dans un téléchargeur bittorrent. Si vous devez effectuer une analyse supplémentaire pour savoir où le morceau doit aller, l'avantage d'un fichier mappé en mémoire peut ne pas être aussi important.