c++ - Almacenamiento de vector en archivo mapeado de memoria
boost memory-mapped-files (1)
Al igual que las muestras, dígale a la clase vectorial sobre su asignador personalizado, así que en lugar de
typedef std::vector<int> MyVec;
MyVec * vecptr = file_vec.find_or_construct<MyVec>("myvector")(alloc_vec);
Utilizar
typedef bi::allocator<int, bi::managed_mapped_file::segment_manager> int_alloc;
typedef std::vector<int, int_alloc> MyVec;
int_alloc alloc(file_vec.get_segment_manager());
MyVec * vecptr = file_vec.find_or_construct<MyVec>("myvector")(alloc);
Tenga en cuenta que
-
vector
usa un asignador para los tipos de elemento (no para el vector; segment_manager lo asigna) - dado que el constructor para
allocator<>
es implícito, también puede pasar elsegment_manager
:
#include <boost/interprocess/managed_mapped_file.hpp>
namespace bi = boost::interprocess;
int main() {
std::string vecFile = "vector.dat";
bi::managed_mapped_file file_vec(bi::open_or_create,vecFile.c_str(), 1000);
typedef bi::allocator<int, bi::managed_mapped_file::segment_manager> int_alloc;
typedef std::vector<int, int_alloc> MyVec;
MyVec * vecptr = file_vec.find_or_construct<MyVec>("myvector")(file_vec.get_segment_manager());
vecptr->push_back(rand());
}
Estoy intentando almacenar un vector de elementos arbitrarios en un archivo mapeado de memoria (por ahora estoy tratando de tener éxito con un vector de ints pero debería funcionar con vectores de objetos arbitrarios). He encontrado mucha documentación sobre cómo hacerlo con la memoria compartida, pero no con los archivos correlacionados de memoria propiamente dichos. Dado que he realizado y usado con éxito R-trees en un archivo mapeado en memoria (como en ese ejemplo ), traté de replicar el proceso con vectores, pero creo que me falta algún elemento crucial porque no funciona. Aquí está mi código:
namespace bi = boost::interprocess;
typedef bi::allocator<std::vector<int>, bi::managed_mapped_file::segment_manager> allocator_vec;
std::string vecFile = "/path/to/my/file/vector.dat";
bi::managed_mapped_file file_vec(bi::open_or_create,vecFile.c_str(), 1000);
allocator_vec alloc_vec(file_vec.get_segment_manager());
std::vector<int> * vecptr = file_vec.find_or_construct<std::vector<int> >("myvector")(alloc_vec);
Probablemente mi última línea es incorrecta, porque "alloc_vec" se pasa como argumento al constructor vectorial, que no lo espera (me sale entre otros el error /usr/include/c++/4.8/bits/stl_vector.h:248:7: note: candidate expects 0 arguments, 1 provided
). Sin embargo, no sé cómo pasar el asignador a find_or_construc (), que supongo que es crucial para que el vector se cree correctamente en el archivo asignado a la memoria. Eliminar (alloc_vec)
al final de la última línea conduce a otro error que tengo más problemas para resolver:
error: cannot convert ‘boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index>::construct_proxy<std::vector<int> >::type {aka boost::interprocess::ipcdetail::named_proxy<boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index>, std::vector<int>, false>}’ to ‘std::vector<int>*’ in initialization
std::vector<int> * vecptr = file_vec.find_or_construct<std::vector<int> >("myvector");
Cualquier ayuda será muy apreciada.