为std::deque使用磁盘分配器



如何将std::deque的内容存储到磁盘上?我发现你可以指定一个分配器,即

std::deque<std::unique_ptr<my_struct>>, disk_allocator<std::unique_ptr<my_struct>>> q;

如何编写自定义分配器"disk_allocator"要存储在磁盘上吗?std库中是否已经存在一个?

你可以用金属。由于这是一个巨大的主题,因此明确建议使用库有点尴尬,并且为了确保解决方案能够满足您的需求,重要的是要深入了解分配器,内存映射,持久性,序列化和朋友解决的单个问题的概念(我在问题评论中链接了有关这些主题的资源)。

话虽如此,金属可以这样使用:

// Example for deque<int>
using namespace metall;
namespace mc = metall::container;
using deque_t = deque<int, metall::allocator<int>>;
void create_data()
{
manager mg(create_only, "/tmp/dir");
// storage location      ^^^^^^^^ 
deque_t* p = mg.construct<deque_t>("deque")(mg.get_allocator());
p->push_back(10); // Can use it normally
}
void reattach_data()
{
manager mg(create_only, "/tmp/dir");
// storage location      ^^^^^^^^ 
deque_t* p = mg.find<deque_t>("deque").first;
p->push_back(10); // Can resume work
}

您可以查看标准库互操作性的相关示例。

如果你愿意使用序列化,谷类有大多数标准库容器的绑定,包括deque。

您不能为了与std::deque一起使用而从磁盘分配。至少这不是我们将STL容器数据存储到磁盘的方式。STL分配器的工作是封装对象的访问/寻址、分配/回收和构造/销毁策略。


用于复制/粘贴和测试:serialize_deserialize_example
template<typename Container>
void save_to_disk(Container const& container, std::filesystem::path const& path)
{
std::ofstream output(path);
if(!output.is_open())
{
throw std::runtime_error("Couldn't open file: " + path.string());
}
for(auto const& item : container)
{
output << item << std::endl;
}
}

但是很明显,我们并不总是有那么简单的数据结构来简单地转换成字符串并返回。对于STL容器的序列化,我建议使用Boost。序列化:
用于复制/粘贴和测试:boostrongerialize_deserialize

struct my_structure final
{
friend class boost::serialization::access;
std::deque<std::string> data;
template<class Archive>
void serialize(Archive& ar, unsigned int const)
{
ar& data;
}
};