Un example d'utilisation de Memory-mapped files

a marqué ce sujet comme résolu.

Je m'intéresse à la lecture et à l'écriture de fichiers textes plutôt imposants (facilement 1-10Go) en C++, et un point qui semble revenir souvent est l'utilisation de fichiers mappés en mémoire (traduction hasardeuse s'il en est …). Cet appel système mmap semblerai améliorer les performances de lecture/écriture. Comme je veux faire quelque chose qui soit portable, j'ai trouvé un bout de la bibliothèque Boost.iostreams qui semble faire ça, et de manière transparente sur Windows et *nix.

Seulement, je ne trouve aucun exemple d'utilisation sur le net, et la doc n'est pas des plus claire … Les seuls examples que j'ai trouvé me donnaient une segfault lorsque je tentais de les lancer. Donc je fait appel à vous, connaissez-vous par hasard cette bibliothèque et son utilisation, ou bien connaissez-vous un site/tutoriel qui explique ça bien ?

De manière plus théorique, je vois écrit de partout que l'appel à mmap ajoute le fichier dans "la zone d'adresses mémoire du programme", et qu'il me faut faire attention à la "pagination". Comme j'ai un peu appris l'info sur le tas, je ne vois pas trop de quoi on parle … Là encore, auriez-vous des ressources à me conseiller sur ces sujets ?

+0 -0

J'ai eu plus de succès sur le site d'en face, je met donc la réponse ainsi qu'un lien si d'autres en ont besoin :

Je ne peux pas t'aider sur la partie théorique de ta question, mais pour ce que est de l'utilisation de boost, le type que tu dois utiliser est io::stream<io::mapped_file> (où io est défini par namespace io = boost::iostreams;). Pour l'utilisation, c'est pareil que std::fstream de la bibliothèque standard. Le fichier doit exister avant et il y a quelques limitations. Niveau installation, cette partie de boost.iostreams n'est pas header-only, il faut linker avec libboost_iostreams.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
#include<string>

#include<boost/iostreams/device/mapped_file.hpp>
#include<boost/iostreams/stream.hpp>

namespace io = boost::iostreams;

int main()
{
   using mapped_file_stream = io::stream<io::mapped_file>;
   auto file_name = "file_name";

   {
       mapped_file_stream mfile_stream(file_name);
       std::string read;
       mfile_stream >> read;
       std::cout << read;
   }

   {
       mapped_file_stream mfile_stream(file_name);
       mfile_stream << "new_write";
   }

}

Freedom

http://progdupeu.pl/forums/sujet/860/c-utilisation-de-fichier-mappes-en-memoire-mmap-avec-boost

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte