【问题标题】:boost::circular_buffer equivalent for files?文件的 boost::circular_buffer 等效项?
【发布时间】:2015-05-29 07:07:33
【问题描述】:

我正在寻找一个允许在磁盘上获取循环缓冲区的库。
在 Boost 中也有类似的东西,但它是基于内存的容器:circular_buffer

【问题讨论】:

  • 也许只有我一个人……但是你说的磁盘上的循环缓冲区是什么意思。您的意思是缓冲区在磁盘上吗?文件句柄的缓冲区?部分分页到磁盘上的循环缓冲区?!?
  • @RollenD'Souza - 我的意思是一个可以增长到一定限制的文件,当超过这个限制时,它会从头开始覆盖自己。一个典型的例子是日志文件。
  • @RollenD'Souza - 无论如何你可能是对的:它在磁盘上时可能不会被称为循环缓冲区......
  • @Pietro:通常循环日志文件在两个日志文件之间来回移动,因此磁盘上始终至少有 XMb 的日志,并且最旧的条目始终位于文件的顶部。我不认为 boost 可以轻松做到这一点。

标签: c++ boost disk circular-buffer


【解决方案1】:

你可以随意称呼它。

您正在寻找内存映射文件。

使用正确的分配器,您可以使容器在此内存映射区域中进行分配。这将使容器“在磁盘上”。

我看看Boost Circularbuffer是否直接支持这个。

更新是的。

最好的一点是,这让你完全有可能使用 IPC 同步和线程同步。使用“私有”内存映射,您可以将缓冲区映射为可读写,而无需在某些进程中将更改写回磁盘。

概念证明:

Live On Coliru ¹

#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 上,文件大小受到限制,这是可以理解的。

【讨论】:

  • 通过现场演示添加了概念验证
  • 就我而言,我无法将文件映射到内存中,但这是一个有趣的解决方案。
  • 因为文件的大小。而且仅用于日志,将任何 RAM 专用于它是不够“有价值的”。
  • @Pietro 这就是我问的原因。内存映射文件占用 RAM 是一个非常普遍的误解。它只是虚拟的。事实上,内存映射文件正是当您的数据结构无法放入物理 RAM 时使用的解决方案
  • @Pietro 参见例如this answer 解决了内存映射的一般工作原理,以及后续Memory usage when using mapped_file
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多