2009-12-07 4 views
40

J'ai une application qui reçoit des morceaux de données sur le réseau, et écrit ces 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, ils représentent en fait. Je me demande s'il est utile d'utiliser ou non des fichiers mappés en mémoire - d'abord pour écrire les morceaux individuels sur le disque, ensuite pour le fichier unique dans lequel ils sont tous décodés.Quand utiliser des fichiers mappés en mémoire?

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

Éditer: C'est une application C#, et je ne prévois qu'une version x64. (Le problème de 'plus grand espace libre contigu ne devrait donc pas être pertinent)

+0

Bon appel, j'ai édité mon poste pour élaborer - Ce sera une application x64 seulement. – Pygmy

+1

Quels avantages pensez-vous en utilisant un fichier MM vous donnera? –

+0

La vitesse n'est-elle pas le principal avantage des fichiers mmap'ed? –

Répondre

25

Les fichiers mappés en mémoire sont utiles pour les scénarios dans lesquels une partie (vue) relativement petite d'un fichier considérablement plus important doit être accessible à 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 les parties les plus récemment utilisées du fichier mappé. En outre, les fichiers mappés en mémoire peuvent exposer des fonctions 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 blocs arrivent en désordre. Cependant, vous devez toujours connaître la taille finale du fichier à l'avance.

De même, vous devriez accéder aux fichiers une seule fois, pour écrire un morceau. Ainsi, un avantage de performance sur E/S asynchrones explicitement mis en œuvre est peu probable, mais il peut être plus facile et plus rapide à mettre en œuvre votre graveur de fichier correctement.

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

+4

Je ne suis pas d'accord que MMF sont pour les petites vues seulement. Sur les systèmes 64 bits, vous pouvez facilement afficher une vue sur l'ensemble du fichier. Le repositionnement d'une vue est une opération d'E/S coûteuse. –

+2

Vous avez raison. Ils peuvent être utilisés pour des vues arbitrairement grandes ou complètes, en particulier sur l'espace d'adressage 64 bits. Mais ce n'est pas là qu'ils brillent, en particulier, lorsque le fichier est lu ou écrit une seule fois. Mon point est, dans de tels cas, les E/S asynchrones seront aussi efficaces, mais plus difficiles à implémenter correctement. – user33675

3

Je dirais que les deux cas sont pertinents. Il suffit d'écrire les morceaux individuels à leur place dans le fichier de mémoire mappée, hors d'usage, car ils entrent en jeu. Bien sûr, est seulement utile si vous savez où chaque morceau devrait aller, comme dans un téléchargeur bittorrent. Si vous devez effectuer une analyse supplémentaire pour savoir où le morceau devrait aller, au profit d'un fichier mis en correspondance de mémoire peut ne pas être aussi grande.

12

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

Dans votre cas, essayez-vous d'améliorer les performances d'E/S?

Je déteste signaler la obivious, mais Wikipédia donne un bon aperçu de la situation ... http://en.wikipedia.org/wiki/Memory-mapped_file

... Plus précisément

La mémoire approche a cartographié son coût dans les défauts de page mineurs - lorsqu'un bloc de données est chargé dans le cache de pages, mais pas encore mappé dans l'espace mémoire virtuel du processus. Selon les circonstances, les E/S du fichier mappé en mémoire peuvent être sensiblement plus lentes que les E/S de fichier standard.

Il semble que vous soyez sur le point d'optimiser prématurément votre vitesse. Pourquoi ne pas utiliser une approche de fichier standard, puis refactoriser les fichiers MM plus tard si nécessaire?

+2

Je vise une meilleure performance IO. Je reçois environ 12 Mo/s de données maintenant (mais dans le futur ce sera beaucoup plus) et doit être capable de le traiter/de l'écrire sur le disque aussi vite que possible. J'ai lu l'article wikipedia, et je comprends les avantages de la lecture, mais la meilleure utilisation et les avantages quand * écrire * dans les fichiers n'est pas très clair pour moi, c'est pourquoi je demande de l'aide pour le comprendre:) – Pygmy

Questions connexes