Fondamentalement, ce que je suis après est l'équivalent de la file d'attente de la bibliothèque de modèles standard implémentée de manière à utiliser le disque de stockage. Le volume de données devra être dans la file d'attente est bien supérieur à celui possible dans la RAM de la plupart des ordinateurs aujourd'hui. P>
Idéalement, je suis après une bibliothèque à utiliser. Cependant, toute recommandation sur la manière de mettre en œuvre cette file d'attente serait utile. P>
5 Réponses :
Vous voudrez peut-être consulter le STXXL : P>
"Le noyau de STXXL est une mise en oeuvre de la bibliothèque de gabarits standard C ++ STL pour des calculs de mémoire externe (hors noyau), c'est-à-dire que STXXL implémente des conteneurs et des algorithmes pouvant traiter d'énormes volumes de données qui ne correspondent que sur des disques. " p>
+1 belle petite bibliothèque. Je ne savais pas que cela existait!
C'est une belle bibliothèque. Il prend également en charge la suppression de données sur plusieurs disques.
Merci. Cela ressemble exactement à ce dont j'ai besoin.
Une idée sauvage: implémenter une classe d'allocator qui lit / écrit à partir d'un fichier sur disque et transmettez-le sur stl deque code> ou
file d'attente code> ou quelque chose qui vous convient. p>
Cool idée, sauf que l'allocator d'implémentation de conteneurs STL typique n'est appelé que pour allouer / libre mémoire. Au cours de l'itération ordinaire, par exemple, l'allocator n'est pas impliqué du tout. Et le conteneur lui-même ne générera pas de "défauts de page" pour déclencher des charges de page.
Boost :: Interprocess fait exactement cela. Si vous êtes dans UserSpace avec Boost, vous êtes tous définis.
Vous voudrez peut-être examiner le Bibliothèque STLXX . Il contient une file d'attente prioritaire basée sur un disque à l'aide du " HeaP de séquence < / a> "modèle décrit par Peter Sanders. P>
Parlez-nous des données. Est-ce que chaque article est grand ou petit? Est-ce une taille fixe ou une variable très variable? Le problème avec le stockage de disque est que, car les éléments deviennent plus variés de taille, plus le problème commence à ressembler à un problème de base de données. Dans ce cas, vous devriez probablement examiner quelque chose comme une base de données SQLLITE comme magasin de support à votre file d'attente. Ensuite, vous pouvez simplement utiliser SQL pour tirer le premier enregistrement. P>
Si les données sont vraiment importantes, vous pouvez simplement stocker chaque objet sur le système de fichiers en utilisant déjà le nom de fichier. Ensuite, vous n'avez même pas besoin de stocker la file d'attente en mémoire. La date de fichier devient votre commande FIFO. Il suffit de saisir le fichier le plus ancien du répertoire pour tirer le premier élément de la "pile". P>
Enfin, si les données sont petites et nombreuses, vous pouvez envisager de remplacer l'allocator d'une liste STD :: Liste ou std :: DEQUE. Il pourrait être possible de masquer le fichier io dans la classe d'allocator. Je n'ai pas de solution simple pour la petite et nombreuses instructions de données. P>
Voici comment un créateur du gestionnaire de file d'attente ira bien sûr il existe des constructeurs pour coder
if(p[i].printerq.size()>0) { temp_int=p[i].printerq.back().getPid(); counter=0; cout<<"Ready to continue?"<<endl; system("pause"); system("cls"); cout<<"Printer "<<i+1<<endl<<endl; do { if(counter==3) { cout<<"Ready to continue?"<<endl; system("pause"); system("cls"); counter=0; } cout<<p[i].printerq.front(); p[i].printerq.push(p[i].printerq.front()); p[i].printerq.pop(); ++counter; }while(temp_int!=p[i].printerq.front().getPid()); if(p[i].printerq.size()>1) { cout<<p[i].printerq.front(); p[i].printerq.push(p[i].printerq.front()); p[i].printerq.pop(); } } else { cout<<"Printer "<<i+1<<" is empty."<<endl; }
Souvent, vous pouvez résoudre celui-ci en ayant une pile de poignées en mémoire.