2015-03-25 1 views
1

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?

+0

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?!? –

+0

@ 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

+0

@ 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

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:

Live On Coliru ¹

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

+0

Ajout d'une preuve de concept avec démo en direct – sehe

+0

Dans mon cas, je ne peux pas avoir le fichier mappé en mémoire, mais c'est une solution intéressante. – Pietro

+0

@pietro pourquoi pas? – sehe