Question

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 des fichiers mappés en mémoire ou non -. Tout d'abord pour écrire les morceaux individuels sur le disque, deuxième pour le seul fichier dans lequel tous sont décodées

Mon sentiment est qu'il pourrait être utile pour le second cas seulement, quelqu'un a quelques idées sur ce sujet?

Edit: Il est une application C #, et je prévois seulement une version 64 bits. (Donc, en cours d'exécution dans le problème « plus grand espace libre contigious » ne devrait pas être pertinent)

Était-ce utile?

La solution

Les fichiers mappés en mémoire sont bénéfiques pour les cas où une partie relativement faible (vue) d'un besoin beaucoup plus grand fichier à accéder à plusieurs reprises.

Dans ce scénario, le système d'exploitation peut aider à optimiser l'utilisation de la mémoire et le comportement global d'échange de l'application par la pagination et que les portions les plus récemment utilisés du fichier mis en correspondance.

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

Pour votre scénario, les fichiers mappés en mémoire peut vous aider à assembler le fichier si les morceaux arrivent hors d'usage. Cependant, vous aurez encore besoin de connaître la taille du fichier final à l'avance.

En outre, vous devriez être 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é le support pour les fichiers mappés en mémoire et il y a des articles complets avec des exemples de code, par exemple http: //blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx .

Autres conseils

fichiers mappés en mémoire sont principalement utilisés pour la communication inter-processus ou E / S amélioration de la performance.

Dans votre cas, essayez-vous d'obtenir de meilleures 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 la page, mais pas encore mis en correspondance dans l'espace de mémoire virtuelle du processus. Selon les circonstances, le fichier mis en correspondance la mémoire E / S peut effectivement être sensiblement plus lent que le fichier E / S standard.

On dirait que vous êtes sur le point d'optimiser prématurément la vitesse. Pourquoi pas une approche régulière des fichiers, puis factoriser des fichiers MM plus tard si nécessaire?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top