Je suis en train de travailler sur un mmap-allocateur qui permet vecteurs pour utiliser la mémoire de
un fichier mappé en mémoire. Le but est d'avoir des vecteurs que l'utilisation de stockage que
sont directement dans la mémoire virtuelle obtenue par mmap. Notre problème est de
améliorer la lecture de gros fichiers (>10GB) dans la mémoire avec aucune copie
les frais généraux, donc j'ai besoin de cet allocateur personnalisé.
Jusqu'à présent j'ai le squelette d'un allocateur personnalisé
(qui dérive de std::allocator), je pense que c'est un bon départ
point d'écrire propre allocateurs. N'hésitez pas à utiliser ce bout de code
quelle que soit la façon dont vous le souhaitez:
#include <memory>
#include <stdio.h>
namespace mmap_allocator_namespace
{
template <typename T>
class mmap_allocator: public std::allocator<T>
{
public:
typedef size_t size_type;
typedef T* pointer;
typedef const T* const_pointer;
template<typename _Tp1>
struct rebind
{
typedef mmap_allocator<_Tp1> other;
};
pointer allocate(size_type n, const void *hint=0)
{
fprintf(stderr, "Alloc %d bytes.\n", n*sizeof(T));
return std::allocator<T>::allocate(n, hint);
}
void deallocate(pointer p, size_type n)
{
fprintf(stderr, "Dealloc %d bytes (%p).\n", n*sizeof(T), p);
return std::allocator<T>::deallocate(p, n);
}
mmap_allocator() throw(): std::allocator<T>() { fprintf(stderr, "Hello allocator!\n"); }
mmap_allocator(const mmap_allocator &a) throw(): std::allocator<T>(a) { }
template <class U>
mmap_allocator(const mmap_allocator<U> &a) throw(): std::allocator<T>(a) { }
~mmap_allocator() throw() { }
};
}
Pour l'utiliser, déclarer un conteneur STL comme suit:
using namespace std;
using namespace mmap_allocator_namespace;
vector<int, mmap_allocator<int> > int_vec(1024, 0, mmap_allocator<int>());
Il peut être utilisé par exemple pour ouvrir une session chaque fois que la mémoire est allouée. Ce qui est nécessaire
est le relier struct, sinon le vecteur contenant utilise le super-classes allouer/désallouer
des méthodes.
Mise à jour: Le mappage de la mémoire de l'allocateur est maintenant disponible à https://github.com/johannesthoma/mmap_allocator et LGPL. N'hésitez pas à utiliser pour vos projets.