Bonjours, depuis quelque jour je me pose la question suivante : Comment faire pour charger en mémoire des fichier dont la taile est importante ( ex: 10 Go ).
Est-ce que cela a un lien avec la mapping de fichier ?
merci
Bonjours, depuis quelque jour je me pose la question suivante : Comment faire pour charger en mémoire des fichier dont la taile est importante ( ex: 10 Go ).
Est-ce que cela a un lien avec la mapping de fichier ?
merci
Si t'as pas 10 go de mémoire (sur un pc c'est rare, après sur les servers je dis pas) tu pourras pas. Enfin tu peux pas charger la totalité en tout cas. Il te faudra juste charger une petite partie, puis passez à une autre quand t'as finis tes traitements etc
"Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu
???
Ben normalement comme pour n'importe quel fichier...
Les fonctions de traitement de fichier depuis une petite vingtaine d'années utilisent des int64 pour gérer la position...
Après pour le charger entièrement en mémoire addressable, reste a avoir 10Go addressable, donc un OS 64 bits.... Par contre, pas besoin d'avoir physiquement 10Go bien entendu.
Pour l'avoir entièrement en mémoire, il faut non seulement un OS 64 bits, mais + de 10Go de RAM.
Maintenant.... déjà que pour un fichier de plusieurs centaines de Mo, dans 99% des cas on n'a jamais besoin de l'avoir entièrement en mémoire, je vois mal pourquoi tu voudrais faire ça.... Si tu commencais par là ? Nous dire ce que tu veux faire ?
A noter que le mapping de fichier est la méthode d'IO (pour les gros fichiers en tout cas) la plus efficace. Et tu peux mapper 128Mo du fichier à (presque) n'importe quel endroit, et modifier cet endroit à la volée...
N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
Et surtout
Sur les machines actuelles, et pour quelques années encore, la réponse est "vaut mieux pas".
Si tu veux absolument, il te faut effectivement un OS qui te permet d'adresser 10Go de mémoire, soit un OS 64 bits (en 32 tu buteras sur une limite quelquepart entre 2 et 4 Go...). Et ensuite c'est comme un fichier plus petit (faut juste te rappeler de ne pas utiliser d'entiers pour stocker des positions, sinon ca marchera pas).
Mais en général, on travaille sur de tels fichiers "par petits bouts": on se déplace dedans (avec des seekg()) et on en lit des bouts en mémoire (avec des read()). Idéalement, il faut avoir (ou construire au démarrage à partir d'une lecture séquentielle) une sorte de "dictionnaire" qui te dit où chaque chose se trouve, et sert à "diriger" des seekg.
Sur de gros fichiers, il est également utile de bien choisir (éventuellement de retravailler) le format de tes données. En particulier, il vaut mieux, toujours, travailler en mode binaire, et lire un nombre fixe d'octets à chaque appel (plutôt que faire des getlines et autres appels qui testent chaque lecture), il est également utile que les données dont on a besoin en meme temps se trouvent à peu près au même endroit dans le fichier (sinon, la lecture depuis le disque va prendre un temps fou).
Pas tout à fait. Le mapping mémoire est une méthode bas niveau pour la lecture de fichiers de taille moyenne. En gros, cela permet d'accéder plus vite et plus simplement (comme un bête pointeur) aux données d'un fichier.
Ca marche très bien sur des fichiers (locaux) assez gros (de qq Mo à quelques centaines de Mo sur les machines usuelles). Sur de petits fichiers, ca ne gagne pas vraiment de temps. Sur des gros, ou très gros (disons 500 Mo ou plus), les créations de mapping peuvent échouer, en fonction de l'état de la mémoire libre.
Francois
, mais pas sur les fichiers très gros,
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager