2009-03-29 4 views
2

De nombreux éditeurs hexadécimaux, tels que Hex Workshop, peuvent même lire des fichiers de grande taille tout en conservant une empreinte mémoire relativement faible, tout en conservant un défilement fluide. Je cherche le meilleur moyen d'y parvenir, et j'ai donc plusieurs questions connexes.

Devrais-je simplement utiliser FileStream?
    - La mise en mémoire tampon est-elle basée sur l'emplacement de recherche actuel? (Sera-t-il généralement un défaut de page lors du défilement arrière?)
    - Si je crée un wrapper pour FileStream qui n'utilise que Seek en interne, est-ce que je vais nuire à la capacité de FileStream à tamponner correctement? (Est-ce que je peux me fier à l'algorithme Buffering ou au planificateur de disque pour maintenir les performances?)

Serait-il préférable d'utiliser des E/S mappées en mémoire? (Je ne m'attends vraiment qu'à des fichiers d'une capacité pouvant atteindre 100 Mo.)
    - Les erreurs de recherche de pages/saut/défilement rapide créent-elles des problèmes de performance?

Finalement, les données doivent être affichées. Devrais-je rendre le fichier entier sous forme de bitmap et invalider des parties de l'image lors des changements (en laissant le contrôle de défilement effectuer sa propre recherche sur l'image) ou devrais-je générer la zone d'affichage en cours?

Donc, en bref, est-ce que je numérise les données, l'image générée, ou les deux, ou puis-je les générer/générer au besoin? Quelles sont les bibliothèques/objets API (WPF/.Net) les mieux adaptés à cette tâche?Quelle est la meilleure façon d'afficher des fichiers volumineux sans utiliser de grandes quantités de mémoire?

Répondre

2

Vous semblez déjà avoir la réponse.
La solution générale pour cela est d'utiliser Memory Mapped files et laisser le système d'exploitation avec la mise en cache et la recherche.
Essayez d'abord la solution la plus simple et la plus évidente. Si cela ne fonctionne pas à votre satisfaction, optimisez les goulots d'étranglement. Premature optimizations is the root of all evil.

1

100Mo n'est vraiment pas très grand. Donc, dans la mémoire fonctionnerait probablement sur de nouvelles machines.

Mais vous ne voudriez pas que votre solution n'évoluera pas au fil du temps. La minute où vous supposez que la limite est de 100 Mo, quelqu'un l'essayera avec 200 Mo. Donc, je vous recommande de prendre le "chercher" itinéraire - c'est la façon commune de le faire.

Questions connexes