2013-05-06 2 views
0

Je charge actuellement d'énormes quantités de données en mémoire pour y accéder rapidement. Jusqu'à présent, je mets tout en RAM. Mais maintenant que mes données deviennent trop énormes, je ne peux plus le faire. J'utilise donc un fichier mappé.C++: Lecture d'une structure avec un vecteur à partir d'un fichier mappé

Dans ce fichier j'ai stocké des vecteurs de "pitchmarks" pour un fichier audio.

struct udtPitchmark 
{ 
    int ByteStart; 
    int ByteCount; 
}; 

struct udtAudioInfo 
{ 
    int ByteStart; 
    int ByteCount; 
    vector<udtPitchmark>Pitchmarks; 
}; 

Je l'ai écrit d'énormes vecteurs de « udtAudioInfo » dans un fichier comme celui-ci:

// Serialize 
int iSize = nAudioInfos.Content().size(); 
fwrite(&iSize,sizeof(int),1,outfile); 

vector<udtAudioInfo>::iterator it = nAudioInfos.Content().begin(); 
for (;it != nAudioInfos.Content().end(); ++it) 
{ 
    //we need to know the position that the data will be written to 
    int iStartPos= ftell(outfile); 

    fwrite(&it->ByteStart,sizeof(int),1,outfile); 
    fwrite(&it->ByteCount,sizeof(int),1,outfile); 
    int len = it->Pitchmarks.size(); 
    fwrite(&len,sizeof(int),1,outfile); 

    vector<udtPitchmark>::iterator it2 = it->Pitchmarks.begin(); 
    for(;it2 != it->Pitchmarks.end(); ++it2) 
    { 
     fwrite(&it2->ByteStart,sizeof(int),1,outfile); 
     fwrite(&it2->ByteCount,sizeof(int),1,outfile); 
    } 
    //and now we need to know the length of the data that was written 
    int iEndPos= ftell(outfile); 
    int iLen=(iEndPos-iStartPos); 
    //now store the file-location info in a map and save this map when we have saved the entire audio info 
    nMapping.Add (iStartPos,iLen); 
} 

La question est de savoir si je peux facilement lire l'un des udtAudioInfos du fichier mis en correspondance. Je ne suis pas sûr s'il est possible de simplement copier de telles structures à partir d'un fichier vers une variable. Merci pour votre aide.

+1

La mémoire est essentiellement un fichier mappé en mémoire. Les programmes peuvent dépasser la mémoire physique et le système d'exploitation stockera automatiquement les données sur le disque. Très probablement, vous n'avez aucune raison de recréer ce que le système d'exploitation fait déjà. –

+0

Que voulez-vous dire par "lire facilement"? Sérialisation? Ou le mappage de fichiers http://stackoverflow.com/questions/9608950/reading-huge-files-using-memory-mapped-files? – silvesthu

+0

Je veux dire que le problème ici est que la structure est un peu complexe. Je voudrais savoir si je peux lire le mettre dans une variable dans une course ou non. – tmighty

Répondre

1

Si la portabilité et l'implémentation d'un compilateur particulier ne sont pas en cause, si un vecteur <> stocke ses données dans un ordre que vous connaissez, vous pouvez l'adapter en lisant son image de fichier. Les objets STL ne spécifient pas comment ils stockent leurs données, cependant.

Si vous créez un petit test, vous pourrez facilement examiner comment les éléments de votre vecteur sont stockés et vous pourrez travailler à partir de là en toute confiance.

Questions connexes