boost::circular_buffer 等效于文件?
boost::circular_buffer equivalent for files?
我正在寻找一个允许在磁盘上获取循环缓冲区的库。
在 Boost 中有类似的东西,但它是一个基于内存的容器:circular_buffer.
你觉得自然就叫什么吧
您正在寻找内存映射文件。
使用正确的分配器,您可以让容器分配到这个内存映射区域。这将使容器 "on disk".
我直接看看Boost Circularbuffer是否支持这个
更新是。
最棒的是,这让您完全有可能使用 IPC 同步和线程同步。使用 "private" 内存映射,您可以将缓冲区映射为可读写,而无需在某些进程中将更改写回磁盘。
概念验证:
#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());
}
¹ 在 Coliru 上,文件大小受到限制是可以理解的。
我正在寻找一个允许在磁盘上获取循环缓冲区的库。
在 Boost 中有类似的东西,但它是一个基于内存的容器:circular_buffer.
你觉得自然就叫什么吧
您正在寻找内存映射文件。
使用正确的分配器,您可以让容器分配到这个内存映射区域。这将使容器 "on disk".
我直接看看Boost Circularbuffer是否支持这个
更新是。
最棒的是,这让您完全有可能使用 IPC 同步和线程同步。使用 "private" 内存映射,您可以将缓冲区映射为可读写,而无需在某些进程中将更改写回磁盘。
概念验证:
#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());
}
¹ 在 Coliru 上,文件大小受到限制是可以理解的。