istream vs mappage de la mémoire d'un fichier?
Je suis en train de mapper un fichier dans la mémoire et ensuite d'analyser ligne par ligne - est istream ce que je devrais utiliser?
Est istream le même que l'association d'un fichier de la mémoire sous Windows? J'ai eu des difficultés en essayant de trouver un exemple complet de la cartographie d'un fichier dans la mémoire.
J'ai vu des gens lien mappage de la mémoire d'articles à partir de MSDN, mais si quelqu'un peut recommander un petit (~15 ligne?) exemple je vous en serais très reconnaissant.
Je dois être à la recherche de quelque chose de mal, mais lors de la recherche de "C++ mappage de la mémoire exemple" sur Google, je ne pouvais pas trouver un exemple qui inclus une itération à travers.
Ceux-ci étaient les plus proches des résultats (juste pour les gens de réaliser que je ont regardé):
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2044.html#ClassSharedMemoryObjectExample
- http://msdn.microsoft.com/en-us/library/dd997372.aspx (pas de code C++)
- https://beej.us/guide/bgipc/html/multi/mmap.html était pour Unix, je crois, pas sur Windows)
ifstream
ou fopen
) est-elle suffisante?purement pour des raisons de performances. J'ai été sous le (faux?) impression qu'il est plus rapide de cartographie de l'ensemble du dossier?
Cela dépend de ce que vous faites avec les données. Si vous l'utilisez pour un bon analyseur qui implémente les retours en arrière, puis les fichiers mappés en mémoire sont uncontestedly plus vite, mais si vous êtes juste de l'itération transmet à travers les données (comme avec de multiples simple
std::getline
appels), je doute qu'il y aura aucune différence notable. Certainement il n'y a pas de dommage à l'aide d'un fichier mappé en mémoire, sauf si vous êtes faible sur l'espace d'adressage virtuel (probablement un problème dans le code 32 bits avec GO+ taille des fichiers).mmap
-ing, le dossier peut être un peu le plus rapide. BTW, sur Linux, fopen(3) sait à propos de la m
modificateur de mode pour mapper le fichier. Cependant, êtes-vous sûr que cela en vaut la peine? Avez-vous référence? Je suppose que vous allez gagner seulement quelques pour cent de la performance. N'est que pour vous?OriginalL'auteur user997112 | 2012-05-31
Vous devez vous connecter pour publier un commentaire.
std::istream
est un type abstrait – vous ne pouvez pas l'utiliser directement. Vous devriez être en tirent avec un tableau personnalisé adossés à desstreambuf
:Comme pour la carte mémoire elle-même, je vous recommande d'utiliser Coup de pouce.Interprocessus à cet effet:
le Code pour
imemstream
prises de cette réponse par Dietmar Kühl.Cela dépend sur quelle plate-forme vous êtes sur -- C++ standard ne fournit pas les fichiers mappés en mémoire. Sur *nix, il y a
mmap
; sur Windows, il y aCreateFileMapping
. Personnellement, j'utilise Boost.Interprocessus'les fichiers mappés en mémoire, car ils sont multi-plateforme; je vais modifier dans un exemple pour cela.Merci, l'apprécie beaucoup
Si vous êtes à la cartographie d'un fichier texte sur Windows, vous devrez peut-être faire face avec
'\r'
dans le istringstream manuellement.getline(s,ligne) << endl; (de chat) est incorrect.
getline
n' pas de retour de la chaîne qui a été lu. Essayezwhile(std::getline(s, line)) { std::cout << line << "\n"; }
OriginalL'auteur ildjarn
Pas exactement. Ils ne sont pas les mêmes dans le même sens d'un "stream" n'est pas un "fichier".
Pense à un fichier stocké séquence, et à un flux de données comme interface pour le "canal" (un stream_buffer) que la séquence de flux lorsque le déménagement de son magasin vers la réception de variables.
Pense à un fichier mappé en mémoire en tant que "fichier"- au lieu de cela stockée à l'extérieur de l'unité de traitement - sont stockées dans de synchronisation dans la mémoire. Il a l'avantage d'être visible comme un cru de la mémoire tampon d'un fichier. Si vous voulez le lire comme un ruisseau, le plus simple est probablement à l'aide d'un istringstream qui a cru tampon comme le lieu de la lecture.
Cela dépend de ce que tu vas faire avec son contenu. Si le fichier est un texte et vous, qu'à lire les chiffres, vous devez analyser en quelque sorte. Le std::istream (et dérivés) sont juste que de l'analyseur.
OriginalL'auteur Emilio Garavaglia