J'ai un type de fichier personnalisé qui est implémenté dans les sections avec un en-tête à l'affiche le décalage et la longueur de chaque section dans le fichier.Ouverture d'un fichier personnalisé à la demande
Actuellement, chaque fois que je veux interagir avec le fichier, je dois soit charger et analyser l'ensemble de la chose à l'avance, soit choisir uniquement les sections dont j'ai besoin et les charger seulement.
Ce que je voudrais faire est de réaliser une approche hybride où chacune des sections est chargée à la demande.
Il semble cependant que cela présente de nombreux inconvénients potentiels en termes de laisser les poignées de système de fichiers ouvertes plus longtemps que je ne le voudrais et la complexité de code supplémentaire que je devrais encourir.
Existe-t-il des modèles standard pour ce genre de chose? Il semble que mes options sont:
- Il suffit de charger le fichier entier et arrêter rouspéter sur les cycles/mémoire gaspillée
- Chargez le fichier en mémoire sous forme d'octets premières et satisfaire toutes les demandes de sections Déchargées mémoire tampon plutôt que disque. Cela économise le coût d'analyse des sections inutiles et nécessite moins de mémoire (puisque la représentation du disque est beaucoup plus compacte que le modèle d'objet qui l'entoure), mais cela signifie quand même que je gaspille de la mémoire pour les sections que je ne charge jamais.
- Chargez les sections dont j'ai besoin immédiatement et fermez le fichier, mais gardez l'emplacement source du fichier. Ensuite, si une autre section est demandée, rouvrez le fichier et chargez les données. Dans ce cas, je pourrais obtenir des résultats étranges si le fichier sous-jacent est modifié.
- Identique à ce qui précède mais laisse une poignée de fichier ouverte (permettant éventuellement le partage de lecture).
- Chargez le fichier à l'aide d'E/S mappées en mémoire et laissez une vue ouverte sur le fichier.
Toutes les pensées
* le déplacer *, je ne connaissais pas ce truc. As-tu quelques infos pour apprivoiser ma curiosité? :-) –
Eh bien, techniquement, vous ne pouvez pas déplacer une vue existante. Mais vous pouvez démapper l'ancienne vue et recadrer une nouvelle vue dans une section différente du même mmap. Vous pouvez même avoir plusieurs vues du même mmap actif en même temps. J'utilise ce type de technique pour faire défiler les données de fichiers journaux de plusieurs mégaoctets (parfois plusieurs gigaoctets), et cela fonctionne très bien et très rapidement. –