Je suis à la recherche d'une librairie qui permet d'obtenir un buffer circulaire sur disque.
Dans Boost, il y a quelque chose de similaire, mais c'est un conteneur en mémoire: circular_buffer.boost :: circular_buffer équivalent pour les fichiers?
1
A
Répondre
6
Vous pouvez l'appeler tout ce que vous pensez est naturel.
Vous recherchez des fichiers mappés en mémoire. En utilisant l'allocateur de droite, vous pouvez attribuer des conteneurs dans cette région mappée en mémoire. Cela rendrait le conteneur "sur disque".
Je verrai si Boost Circularbuffer supporte cela directement.
Mise à jour Oui. La meilleure chose à faire est de pouvoir utiliser la synchronisation IPC et la synchronisation des threads. En utilisant une carte mémoire «privée», vous pouvez mapper le tampon en lecture-écriture sans écrire les modifications sur le disque dans certains processus.
Preuve du concept:
#include <boost/circular_buffer.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/managed_mapped_file.hpp>
namespace bip = boost::interprocess;
struct message {
int data[32];
};
int main()
{
bip::managed_mapped_file mmf(bip::open_or_create, "/tmp/circ_buffer.bin", 4ul << 20);
typedef bip::allocator<message, bip::managed_mapped_file::segment_manager> allocator;
boost::circular_buffer<message, allocator> instance(100, mmf.get_segment_manager());
}
¹ Sur le Coliru est filesize - naturellement limitée.
Peut-être que je suis le seul ... mais que voulez-vous dire par un * tampon circulaire sur le disque *. Voulez-vous dire que le tampon est * seulement * sur le disque? Un tampon de handles de fichiers? Un tampon circulaire qui est partiellement paginé sur un disque?!? –
@ RollenD'Souza - Je veux dire un fichier qui peut atteindre une certaine limite, et quand cette limite est dépassée, il commence à se remplacer par le début. Un exemple typique est un fichier journal. – Pietro
@ RollenD'Souza - De toute façon vous avez probablement raison: il ne peut pas être appelé tampon circulaire quand il est sur le disque ... – Pietro