2009-07-29 11 views
1

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:

  1. Il suffit de charger le fichier entier et arrêter rouspéter sur les cycles/mémoire gaspillée
  2. 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.
  3. 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é.
  4. Identique à ce qui précède mais laisse une poignée de fichier ouverte (permettant éventuellement le partage de lecture).
  5. 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

Répondre

1

Si possible, MMAP-ment tout le fichier est généralement la meilleure chose à faire si vous avez un modèle d'accès aléatoire. De cette façon, il vous suffit de déléguer le problème de chargement/déchargement à l'OS et vous avez gratuitement 1 & 2. Si vous avez des modèles d'accès très spéciaux, vous pouvez même utiliser quelque chose comme fadvise() (je ne suis pas l'équivalent exact de Win32) pour indiquer à l'OS votre intention d'accès.

Si votre fichier est supérieur à 2 Go et que vous pouvez utiliser la méthode 64bits ou mmap() à la demande.

1

Si le fichier est relativement petit, mmap-ing le fichier entier est assez bon. Si le fichier est volumineux, vous pouvez laisser une vue mmap ouverte, et simplement la déplacer autour du fichier et la redimensionner pour afficher chaque section si nécessaire.

+0

* le déplacer *, je ne connaissais pas ce truc. As-tu quelques infos pour apprivoiser ma curiosité? :-) –

+0

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. –