6
votes

FILET FIFO (ou Stack) implémentée sur le disque, pas la RAM (de préférence en C ++)

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.

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.


1 commentaires

Souvent, vous pouvez résoudre celui-ci en ayant une pile de poignées en mémoire.


5 Réponses :


10
votes

Vous voudrez peut-être consulter le STXXL :

"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. "


3 commentaires

+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.



1
votes

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 ou file d'attente ou quelque chose qui vous convient.


2 commentaires

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.



2
votes

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.


0 commentaires

0
votes

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.

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".

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.


0 commentaires

0
votes

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;
                }


0 commentaires