Estoy trabajando en un mmap-allocator que permite a los vectores utilizar la memoria de un archivo mapeado en memoria. El objetivo es tener vectores que usen almacenamiento que estén directamente en la memoria virtual mapeada por mmap. Nuestro problema es mejorar la lectura de archivos realmente grandes (> 10GB) en la memoria sin copia sobrecarga, por lo tanto, necesito este asignador personalizado.
Hasta ahora tengo el esqueleto de un asignador personalizado (que deriva de std :: allocator), creo que es un buen punto de partida para escribir asignadores propios. Siéntase libre de utilizar este pedazo de código en la forma que desee:
#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() { }
};
}
Para usar esto, declarar un contenedor STL de la siguiente manera:
using namespace std;
using namespace mmap_allocator_namespace;
vector<int, mmap_allocator<int> > int_vec(1024, 0, mmap_allocator<int>());
Se puede utilizar por ejemplo para iniciar la sesión cada vez que la memoria está asignado. Lo que es necesario es la estructura de reenlace, de lo contrario, el contenedor de vectores utiliza las superclases asignar/desasignar métodos.
Actualización: El asignador de asignación de memoria ahora está disponible en https://github.com/johannesthoma/mmap_allocator y es LGPL. Siéntase libre de usarlo para sus proyectos.
Gracias por ese segundo enlace. El uso de asignadores para implementar montones de hilos privados es inteligente. Me gusta que este sea un buen ejemplo de dónde los asignadores personalizados tienen una clara ventaja en un escenario que no tiene recursos limitados (embebido o consola). – Naaff
El enlace original ya no está, pero CiteSeer tiene el PDF: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.71.8289 –
Tengo que preguntar: ¿Puedes mover ese vector de manera confiable? en otro hilo? (Supongo que no) – sellibitze