2011-07-03 3 views
2

J'ai réussi à analyser un gros fichier binaire (~ 8 Go) en lisant des blocs de données en mémoire et en inversant les entiers big-endian en utilisant les fonctions montrées ci-dessous. Cependant, j'essaie d'obtenir plus de performance en utilisant Boost Memory-Mapped files mais je ne suis pas capable d'utiliser les fonctions endian_swap parce que le fichier est ouvert en mode lecture seule. Existe-t-il un moyen efficace d'échanger les octets sans écrire le fichier d'origine? Si non, les performances seraient affectées par le surdébit d'E/S?Méthode efficace d'échange d'octets dans un fichier mappé en mémoire

inline void endian_swap(unsigned short int& x) 
{ 
    x = (x>>8) | 
    (x<<8); 
} 
inline void endian_swap(unsigned int& x) 
{ 
    x = (x>>24) | 
    ((x<<8) & 0x00FF0000) | 
    ((x>>8) & 0x0000FF00) | 
    (x<<24); 
} 
inline void endian_swap(unsigned long long int& x) 
{ 
    x = (((unsigned long long int)(x) << 56) | \ 
     (((unsigned long long int)(x) << 40) & 0xff000000000000ULL) | \ 
     (((unsigned long long int)(x) << 24) & 0xff0000000000ULL) | \ 
     (((unsigned long long int)(x) << 8) & 0xff00000000ULL) | \ 
     (((unsigned long long int)(x) >> 8) & 0xff000000ULL) | \ 
     (((unsigned long long int)(x) >> 24) & 0xff0000ULL) | \ 
     (((unsigned long long int)(x) >> 40) & 0xff00ULL) | \ 
     ((unsigned long long int)(x) >> 56)); 
} 

Le code a été trouvé sur ce article. Je vous remercie beaucoup pour votre temps

Répondre

2

Au moins le système d'exploitation sous-jacent prend en charge votre comportement souhaité:

MAP_PRIVATE 
       Create a private copy-on-write mapping. Updates 
       to the mapping are not visible to other processes 
       mapping the same file, and are not carried through 
       to the underlying file. It is unspecified whether 
       changes made to the file after the mmap() call are 
       visible in the mapped region. 

Le priv drapeau semble se traduire par MAP_PRIVATE:

void* data = 
    ::BOOST_IOSTREAMS_FD_MMAP( 
     const_cast<char*>(p.hint), 
     size_, 
     readonly ? PROT_READ : (PROT_READ | PROT_WRITE), 
     priv ? MAP_PRIVATE : MAP_SHARED, 
     handle_, 
     p.offset); 
if (data == MAP_FAILED) 
    cleanup_and_throw("failed mapping file"); 
+0

Je n » Je réalise la fonction "drapeau openmode" parce que j'utilisais la version 1.42 alors que celle-ci était implémentée sur 1.44. Je vous remercie! – Emer

+0

@Emer, aha! Ce sont les petits détails qui font toute la différence dans le monde .. quand je viens et regarde la source sur le site, il n'est pas du tout évident que c'est une nouvelle fonctionnalité. :) – sarnold

Questions connexes