Question Remplacement STL sur disque pour c ++


J'ai récemment créé une application qui repose en grande partie sur des files d'attente stl et qui ont rencontré des problèmes de mémoire. La taille de la file d'attente devient trop importante pour tenir dans la mémoire de la machine. Existe-t-il des implémentations de file d'attente Open Source, IO / Memory efficaces sur disque pouvant être connectées en place à une file d'attente stl, ce qui fait que mon application utilise par magie moins de RAM?

Je voudrais quelque chose avec des mécanismes tampon en lecture / écriture - puisque mon application contient environ 50 Ko de mises en file d'attente / désenregistrement, et que les objets sont plutôt petits.

Ma file d'attente contient des paires d'entiers 32 bits, ce qui rend chaque saisie 64 bits, les listes liées sont hors de question car elles vont doubler la consommation de mémoire.


10
2017-11-18 19:24


origine


Réponses:


Je chercherais à utiliser STXXL. Il implémente plusieurs interfaces stl contenant un backend de système de fichiers. L'une de ces implémentations concerne la structure deque.


6
2017-11-18 19:32



Oui, veuillez essayer STXXL. Mais n'utilisez pas le deque si vous pouvez éviter un accès aléatoire (par exemple, opérateur []). Utilisez plutôt stxxl :: sequence, elle est efficace dans la mémoire externe.

Disclaimer: Je relance la bibliothèque. S'il vous plaît envoyez-moi un correctif si vous corrigez le problème C ++ 11, qui est probablement dû à la chaîne d'outils de MacOSX.


2
2017-11-18 20:16



std::queue est un adaptateur de conteneur, ce qui signifie qu'il s'agit essentiellement d'une interface sur un autre conteneur. Dans ce cas, la valeur par défaut est std::deque qui est représenté en mémoire comme un vecteur de tableaux de taille constante, puisque le vecteur contient des pointeurs vers les tableaux, il s’insère assez bien dans la mémoire. Si vous voulez que les choses soient moins contiguës, vous pouvez essayer de faire du backend un std::list, les structures liées peuvent souvent gérer de très grandes quantités de données car elles ne doivent pas nécessairement être contiguës.

Vous pouvez également donner votre propre backend à l'interface, il doit répondre aux exigences de Séquenceur


0
2017-11-18 19:30